0

Итак, я использую Jackson для десериализации JSON в сложные Java-объекты. Все работает хорошо, но у меня есть некоторые поля, такие как:Deserializing flattened JSON to Java Object using Jackson

{ 
    "foo.bar.baz":"qux" 
} 

, которые соответствуют ява объектов, таких как:

class Foo { 
    AnotherClass bar; 
} 

class AnotherClass { 
    String baz; 
} 

Джексон не в состоянии понять, что точки соответствуют внутренним объектам. Есть ли способ заставить Джексона иметь возможность десериализовать даже на сплющенных полях, таких как поле в моем примере?

+0

«foo.bar.baz» не не является допустимым JSON формат – CMPS

+0

@CMPS: :) Мне нравится, что ваш ответ также не в правильном формате. – Daniel

+0

Не знаете об реализациях, но ваш пример имеет желаемую семантику, если вы используете парсер YAML. – OrangeDog

ответ

0

Никакая библиотека Jackson JSON не обнаружит это как разные уровни объектов. Вы можете использовать это вместо того, чтобы:

{ 
    "foo": { 
     "bar": { 
      "baz":"qux" 
     } 
    } 
} 

И вы должны будете создать:

  • Класс WrapperClass, содержащий "Foo" типа FooClass
  • Класс FooClass, содержащий "бар" типа BarClass
  • Класс BarClass, содержащий «baz» типа String
0

Вы можете сделать что-то подобное с помощью @JsonUnwrapped:

public class Wrapper { 
    @JsonUnwrapped(prefix="foo.bar.") 
    public AnotherClass foo; // name not used for property in JSON 
} 

public class AnotherClass { 
    String baz; 
} 
0
ObjectMapper mapper = new ObjectMapper(); 
JsonNode root = mapper.readTree(jsonString); 
Iterator<String> iterator = root.fieldNames(); 
while (iterator.hasNext()) { 
    String fieldName = iterator.next(); 
    if (fieldName.contains(".")) { 
     String[] items = fieldName.split("\\."); 
     if (items[0].equals("foo")) { 
      Foo foo = new Foo(); 
      if (items[1].equals("bar")) { 
       AnotherClass bar = new AnotherClass(); 
       foo.bar = bar; 
       if (items[2].equals("baz")) { 
        bar.baz = root.get(fieldName).asText(); 
       } 
      } 
     } 
    } 
}