Как игнорировать имя переменной, но сериализовать значение

У меня есть следующий вывод из кода: {"list":[{"x":"y"},{"a":"b"}]}

Вместо этого я хочу получить вывод как [{"x":"y"},{"a":"b"}]

Код ниже.

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());
  }
 }

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

{"список":[{"карта":{"x":"y","x1":"y1"}},{"map":{"a1":"b1","a":"b "}}]}

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

 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());
}
 }

person Paul Arer    schedule 09.01.2016    source источник
comment
Почему бы тебе просто не позвонить objectMapper.writeValue(writer, t.list)?   -  person Jon Skeet    schedule 09.01.2016
comment
скажем, у меня есть List‹Car›, а у Car есть Map — что тогда? Как игнорировать карту, но распечатать только значения имен, такие как [ {x, y}, {...}] ?   -  person Paul Arer    schedule 09.01.2016
comment
Самым простым решением было бы создать List<Map<...>> из этого List<Car>. Однако может быть способ настроить Джексона так, чтобы он делал это за вас автоматически - вы должны добавить этот пример к своему вопросу в качестве примера того, что вы хотите сделать, в противном случае наиболее очевидным является подход "просто сериализовать t.list".   -  person Jon Skeet    schedule 09.01.2016
comment
Я не хочу переделывать ответ, тем более, что это исправлено, и они могут быть огромными. Я хочу, чтобы сериализация позаботилась об этом, поэтому это один раз. Также отредактировал вопрос в соответствии с вашим предложением.   -  person Paul Arer    schedule 09.01.2016


Ответы (2)


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

Маркерная аннотация, аналогичная XmlValue, указывающая, что результаты аннотированного метода "получателя" (что означает, что сигнатура должна быть такой же, как у получателей; непустой тип возвращаемого значения, без аргументов) должны использоваться как единственное значение для сериализации для экземпляра. Обычно значение имеет простой скалярный тип (строка или число), но может быть любым сериализуемым типом (коллекция, карта или компонент).

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

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());
    }
}
person JB Nizet    schedule 09.01.2016

Я реализовал импорт 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, как указано выше, так как в моей кодовой базе мне не разрешено иметь геттер на карте, а JsonValue не работал для непубличных полей. (или я не мог заставить его работать)

person Paul Arer    schedule 09.01.2016