2016-01-09 5 views
2

У меня есть следующий код: {"list": [{"x": "y"}, {"a": "b"}] }Как игнорировать имя переменной, но значение сериализации - jackson quickxml

Вместо я хочу, чтобы получить выход в [{ "х": "у"}, { "а": "Ъ"}]

код ниже.

public class Test { 
List<Map> list = new ArrayList(); 
public static void main(String [] args){ 
    Test t = new Test(); 

    Map m1 = new HashMap(); 
    m1.put("x","y"); 
    t.list.add(m1); 

    Map m2 = new HashMap(); 
    m2.put("a","b"); 
    t.list.add(m2); 

    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.setSerializationInclusion(Include.NON_EMPTY); 
    objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.NON_PRIVATE); 
    Writer writer = new StringWriter(); 
    try { 
     objectMapper.writeValue(writer, t); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    System.out.println("The json is:\n"+writer.toString()); 
    } 
} 

Обновление этой проблемы - сделать это еще один уровень дает мне:

{ "Список": [{ "карта": { "х": "у", "x1":» y1 "}}, {" map ": {" a1 ":" b1 "," a ":" b "}}]}

Я хочу [{" x ":" y "," x1 " : "y1"}, { "a1": "b1", "а": "б"}]

public class Test { 
public class Car{ 
    Map map = new HashMap(); 
} 
List<Car> list = new ArrayList(); 
public static void main(String [] args){ 
    Test t = new Test(); 

    Test.Car car = t.new Car(); 
    Map m1 = new HashMap(); 
    m1.put("x","y"); 
    m1.put("x1","y1"); 
    car.map = m1; 
    t.list.add(car); 

    car = t.new Car(); 
    Map m2 = new HashMap(); 
    m2.put("a","b"); 
    m2.put("a1","b1"); 
    car.map = m2; 
    t.list.add(car); 

    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.setSerializationInclusion(Include.NON_EMPTY); 
    objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.NON_PRIVATE); 
    Writer writer = new StringWriter(); 
    try { 
     objectMapper.writeValue(writer, t); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    System.out.println("The json is:\n"+writer.toString()); 
} 
} 
+2

Почему бы вам просто не вызвать 'objectMapper.writeValue (writer, t.list)'? –

+0

сказать, у меня есть список и у автомобиля есть карта - то что? Как игнорировать карту, но печатать только имена, такие как [{"x", "y"}, {...}]? –

+0

Простейшим решением было бы создать «Список >» из этого «Список ». Возможно, есть способ настроить Джексона для этого автоматически, но - вы должны добавить этот пример к своему вопросу в качестве примера того, что вы хотите сделать, в противном случае подход «просто сериализовать« t.list »является наиболее очевидным один. –

ответ

1

Вы, вероятно, хотите использовать @JsonValue апп в документации которого указано:

Обозначение маркера, аналогичное XmlValue, которое указывает на то, что результаты аннотированного метода «getter» (что означает, что подпись должна быть у геттеров; non-void return type, no args) должен использоваться как одно значение для сериализации для экземпляра. Обычно значение будет иметь простой скалярный тип (String или Number), но это может быть любой сериализуемый тип (Collection, Map или Bean).

Вот рабочий пример:

public class Test { 
    public static class Car { 
     Map map = new HashMap(); 

     @JsonValue 
     public Map getMap() { 
      return map; 
     } 
    } 

    List<Car> list = new ArrayList(); 

    @JsonValue 
    public List<Car> getList() { 
     return list; 
    } 

    public static void main(String[] args) throws IOException { 
     Test t = new Test(); 

     Car car = new Car(); 
     Map m1 = new HashMap(); 
     m1.put("x", "y"); 
     m1.put("x1", "y1"); 
     car.map = m1; 
     t.list.add(car); 

     car = new Car(); 
     Map m2 = new HashMap(); 
     m2.put("a", "b"); 
     m2.put("a1", "b1"); 
     car.map = m2; 
     t.list.add(car); 

     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); 
     Writer writer = new StringWriter(); 

     objectMapper.writeValue(writer, t); 
     System.out.println("The json is:\n" + writer.toString()); 
    } 
} 
1

Я осуществил импорт com.fasterxml.jackson.databind.JsonSerializable; на классе автомобилей и сделал следующее.

public class Car implements JsonSerializable{ 
    Map map = new HashMap(); 
    @Override 
    public void serialize(JsonGenerator arg0, SerializerProvider arg1) 
     throws IOException, JsonProcessingException { 
     arg0.writeObject(map); 
    } 
    } 

Удалено ключевое слово карты. Я не мог использовать JsonValue, как указано выше, как в моей базе кода. Мне не разрешено использовать getter на Map, а JsonValue не работает для непубличных полей. (или я не мог заставить его работать)