![](/img/trans.png)
[英]Problem Jackson deserialization of JSON and Lombok constructor
[英]json deserialization problem
有一個數組,當大小為1時,我收到的json數據不包含[]
; 喜歡
{"firstname":"tom"}
當大小大於1時,我收到的數據包含[]
,如
[{"firstname":"tom"},{"firstname":"robert"}]
目前我的類包含一個數組屬性
String[] firstname;
//getter setter omit here
代碼處理這個喜歡
ObjectMapper mapper = new ObjectMapper();
MyClass object = mapper.readValue(json, MyClass.class);
當大小大於1時,反序列化工作。 但是,當size為1時,反序列化失敗。
我目前正在使用傑克遜,這個問題的任何解決方案?
我想知道傑克遜/ gson或任何其他圖書館是否可以處理這個問題?
特別是傑克遜,你最好的選擇是首先綁定到JsonNode或Object,如:
Object raw = objectMapper.readValue(json, Object.class); // becomes Map, List, String etc
然后檢查你得到了什么,再次綁定:
MyClass[] result;
if (raw instanceof List<?>) { // array
result = objectMapper.convertValue(raw, MyClass[].class);
} else { // single object
result = objectMapper.convertValue(raw, MyClass.class);
}
但我認為你得到的JSON很糟糕 - 為什么你會返回一個只有1號數組的對象或數組? - 所以如果可能的話,我寧願先修好JSON。 但如果不可能,這將有效。
以下是使用GSON的方法。 讓我們假設這個對象結構:
public class Group{
public Group(final List<Person> members){
this.members = members;
}
private final List<Person> members;
}
public class Person{
public Person(final String firstName, final String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
private final String firstName;
private final String lastName;
}
這是一個解串器,可以理解單個Person條目以及它們的數組:
public class GroupDeserializer implements JsonDeserializer<Group>{
@Override
public Group deserialize(final JsonElement json,
final Type typeOfT,
final JsonDeserializationContext context) throws JsonParseException{
List<Person> members;
if(json.isJsonArray()){
final JsonArray array = json.getAsJsonArray();
members = new ArrayList<Person>(array.size());
for(final JsonElement personElement : array){
members.add(getSinglePerson(personElement, context));
}
} else{
members =
Collections.singletonList(getSinglePerson(json, context));
}
return new Group(members);
}
private Person getSinglePerson(final JsonElement element,
final JsonDeserializationContext context){
final JsonObject personObject = element.getAsJsonObject();
final String firstName =
personObject.getAsJsonPrimitive("firstname").getAsString();
final String lastName =
personObject.getAsJsonPrimitive("lastname").getAsString();
return new Person(firstName, lastName);
}
}
在這里,您可以找到使用它的必要配置
當我嘗試反序列化從XML構造的JSON對象時,我遇到了同樣的問題。 (XML-JSON)。 經過相當多的研究,發現我們有一個簡單的解決方案。
只需設置功能:ACCEPT_SINGLE_VALUE_AS_ARRAY。
ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,true);
欲了解更多信息: http : //fasterxml.github.com/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/DeserializationFeature.html#ACCEPT_SINGLE_VALUE_AS_ARRAY
編輯:我想你只需要提取一個JsonElement
並檢查它是isJsonArray()
和/或isJsonObject()
。 然后,只需調用getAsJsonArray()
或getAsJsonObject()
。
舊答案:為什么不嘗試提取數組並在失敗時捕獲JsonParseException
。 在catch塊中,嘗試提取對象。
我知道它不漂亮但應該有效。
在第一個實例中,它看起來像一個對象,在第二個實例中,它看起來像一個對象數組(聽起來像你期待的那樣)。
對於這樣的情況,JSON編碼庫通常具有“強制數組”選項。 如果失敗,在您的客戶端上,您可以檢查JSON響應,如果它不是數組,則將返回的對象推送到新數組中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.