2016-10-10 3 views
1

Использование JSon библиотеки Джексона в Java, можно сделать следующее:Java jackson как развернуть необработанное значение во время сериализации?

public class MyObject { 
    @JsonRawValue 
    @JsonUnwrapped 
    private String rawJson; 

} 

public class DTO { 

    public MyObject json; 

} 

Пример rawJson:

{ 
    "key": "value" 
} 

Когда DTO сериализации и визуализируется как JSON, я хочу JSON в просто выглядеть следующим образом:

{ 
    "dto": { 
     "key":"value" 

    } 
} 

Вместо этого он всегда:

{ 
    "dto":{ 
     "rawJson":{ 
     "key":"value" 
     } 
    } 
} 

По существу, кажется, что когда одно из ваших свойств является значением JSON, хранящимся в строке с @JsonRawValue, @JsonUnwrapped не работает.

Идеально я ищу сериализационное решение на уровне класса MyObject, а не DTO, иначе мне пришлось бы применять решение не только для DTO, но и для всех других DTO, на которые ссылается MyObject.

Update:

Ниже ответ решил эту проблему в одном месте, но по-прежнему является проблемой в следующем сценарии;

public class DTO2 { 
    @JsonUnwrapped 
    public MyObjectAbstract json2; 
} 

Где MyObject является продолжением MyObjectAbstract, и когда DTO2 MyObjectAbstract является экземпляром MyObject Я хотел бы DTO2 просто сериализовать как:

{ 
    "key": "value" 
} 

Вопрос заключается в том, что всякий раз, когда DTO2.MyObjectAbstract является экземпляром MyObject это сериализовать как:

{ 
    "json": { 
     "key": "value" 
    } 
} 

ответ

0

Вы можете использовать JsonRawValue и JsonValue аннотаций по методу геттер ИНСТЕ объявление. Вот пример:

public class JacksonUnwrapped { 

    static class MyObject { 
     private String rawJson; 

     MyObject(final String rawJson) { 
      this.rawJson = rawJson; 
     } 

     @JsonRawValue 
     @JsonValue 
     String getRawJson() { 
      return rawJson; 
     } 
    } 

    static class DTO { 
     public MyObject json; 

     DTO(final MyObject json) { 
      this.json = json; 
     } 
    } 

    public static void main(String[] args) throws JsonProcessingException { 
     final ObjectMapper objectMapper = new ObjectMapper(); 
     final DTO dto = new DTO(new MyObject(
       "{\"key\": \"value\"}")); 
     System.out.println(objectMapper 
       .writerWithDefaultPrettyPrinter() 
       .writeValueAsString(dto)); 
    } 

} 

Выход:

{ 
    "json" : {"key": "value"} 
} 
+0

Это решило мою проблему в одном случае, когда я в конце концов сделал хотите { "JSON": { "ключ": "значение"}}, но что если бы у меня был другой ссылочный объект DTO2, который я хочу просто сериализовать как {«ключ»: «значение»}. Я уточнил вопрос с деталями. –

+0

По аналогии вы можете добавить геттер с аннотацией JsonValue к классу DTO2. –

+0

Есть ли какое-либо решение, которое не требует каких-либо изменений в классах, ссылающихся на этот объект? Моя забота заключается в том, что в будущем этот класс потенциально может упоминаться во многих местах, что делает его не идеальным для использования логики логики сериализации везде, где на нее ссылаются. –

 Смежные вопросы

  • Нет связанных вопросов^_^