2016-10-25 5 views
1

Я работаю с jackson-core-2.8.3, и у меня есть json, у которого есть элемент, предоставленный в нескольких случаях. Я хочу сопоставить его с моим классом, но я не могу этого сделать, потому что у меня может быть только один тип PropertyNamingStratergy в моем классе.Как десериализовать несколько случаев с помощью Jackson

Пример Json: -

{"tableKey": "1","not_allowed_pwd": 10} 

Там может быть другой, как JSON

{"tableKey": "1","notAllowedPwd": 10} 

ClassToMap: -

class MyClass { 
public String tableKey; 
public Integer notAllowedPwd; 
} 

ObjectMapper код: -

ObjectMapperobjectMapper=new ObjectMapper(); 
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); 
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES,true); 
objectMapper.setSerializationInclusion(Include.NON_NULL); 
objectMapper.setVisibility(PropertyAccessor.ALL,Visibility.NONE); 
objectMapper.setVisibility(PropertyAccessor.FIELD,Visibility.ANY); 
MyClass obj = objectMapper.readValue(s, MyClass.class); 

Я нигде не нашел решения. Будет хорошо, если кто-то может помочь, как действовать дальше.

+0

Посмотрите http://stackoverflow.com/questions/12583638/when-is-the-jsonproperty-property-used-and-what-is-it-used-for –

+0

Эта ссылка может помочь вам http://websystique.com/java/json/jackson-json-annotations-example/ –

+0

Проблема заключается в том, что json может варьироваться при вызове вызова, так что snakecase может быть в формате camelcase – Swaraj

ответ

0

Используйте библиотеку джексон-аннотаций и добавьте @JsonProperty, как показано ниже.

class MyClass { 
    public String tableKey; 
    @JsonProperty("not_allowed_pwd") 
    public Integer notAllowedPwd; 
} 
+0

Спасибо, но у меня разные требования, я отредактировал вопрос. – Swaraj

+0

В этом случае вам придется либо 1) сопоставить два разных класса и объединить вручную, либо 2) исправить схему вашего json. Я не думаю, что изменения/несогласованные имена свойств могут быть легко сопоставлены – kjsebastian

+0

Есть ли какой-либо класс, который используется во время метода readValue, где я могу изменить имя свойства для camelcase usinng my class – Swaraj

0

Вы можете иметь вторые сеттер с @JsonProperty аннотацией для второго имени поля:

class MyClass { 
    private String tableKey; 
    private Integer notAllowedPwd; 

    public String getTableKey() { 
     return tableKey; 
    } 

    public void setTableKey(String tableKey) { 
     this.tableKey = tableKey; 
    } 

    public Integer getNotAllowedPwd() { 
     return notAllowedPwd; 
    } 

    public void setNotAllowedPwd(Integer notAllowedPwd) { 
     this.notAllowedPwd = notAllowedPwd; 
    } 

    @JsonProperty("not_allowed_pwd") 
    public void setNotAllowedPwd2(Integer notAllowedPwd) { 
     this.notAllowedPwd = notAllowedPwd; 
    } 
} 

Примите во внимание, что, если эти два свойства присутствуют в JSON, они будут перезаписаны.