簡體   English   中英

json反序列化問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM