簡體   English   中英

使用最新的Jackson解析器庫在Android設備上解析JSON

[英]Parse JSON on Android device using latest Jackson Parser library

這是JSON響應str的示例:

{"myServiceMethodResult":[{"BoolPropertyOfFooClass":false,"StringPropertyOfFooClass":"tstString", "Bar":[{"BoolPropertyOfBarClass":false,"StringProperyOfBarClass":"tst"}]
}]
}

服務正在返回列表

List<Foo> myServiceMethod(){

return new List<Foo> myFooList
}

這些是類:

@JsonRootName(value = "myServiceMethodResult")
Class Foo{

public boolean BoolPropertyOfFooClass
public String  StringPropertyOfFooClass


@JsonProperty(value = "Bar")
public List<Bar> myBar;


public boolean getBoolPropertyOfFooClass(){

return BoolPropertyOfFooClass;
}

public void setBoolPropertyOfFooClass(bool value){
this.BoolPropertyOfFooClass = value

}

public String getStringPropertyOfFooClass(){

return StringPropertyOfFooClass;
}

public void setBoolPropertyOfFooClass(String value){
this.StringPropertyOfFooClass = value

}

public List<Bar> myBar() {
        return myBar;
    }

    public void setmyBar(List<Bar> value) {
        this.myBar= value;
    }

}

我使用的是傑克遜(Jackson)解析器,首先將JSON字符串解析為一個對象的速度令人驚訝(盡管該文件很大(2 MB)

  String jsonStr = sh.makeServiceCall(serviceUrl/MethodName, ServiceHandler.POST, json_content_parameters);

       ObjectMapper mapper = new ObjectMapper();
       mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
       JsonNode node = null;
     myFooInstance=  mapper.readValue(new StringReader(jsonStr), new TypeReference<List<Foo>>(){}); 

mapper.readValue遇到異常myServiceResult與預期的不匹配(“列表”)。 此外,如果我使用readTree函數,則需要5秒鍾(但不是hittign異常)。 有沒有更好的方法可以更快地獲得對象,

更進一步,我無法弄清楚如何在Foo對象內映射Bar對象的List。 我可以使用以下代碼行設置屬性:

TypeReference<List<Foo>> typeRef = new TypeReference<List<Foo>>(){};
myInstanceFoo= mapper.readValue(node.traverse(), typeRef);

所以我有我的Foo對象列表,但是我無法使用類似的東西使List進入列表。 關於持續時間問題或設置內部List對象的任何幫助將不勝感激

跟蹤:

com.fasterxml.jackson.databind.JsonMappingException: Root name 'MyMethodResponse' does not match expected ('List') for type [collection type; class java.util.List, contains [simple type, class com.package.Foo]]
 at [Source: java.io.StringReader@411dc790; line: 1, column: 2]

由於看起來響應包含在一個單成員對象實例中,因此可以選擇使用以下方法注釋Foo類:

@JsonRootName("MyMethodResponse")

重要提示:名稱為FIXED。

但是,您尚未完成。 您需要配置ObjectMapper以使用此注釋:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE);

您還有另一個問題。 即,您的List<Bar>在POJO中的名稱為myBar ,但在生成的JSON中的名稱為Bar 您需要將您的注釋myBar與現場@JsonProperty

@JsonProperty("Bar")

萬一有人偶然發現了一個相同的問題,我想通了。 如果JSON格式為序列化Foo類

{"response":[{"propertyOfFooClass":"something"
}]
} 

您需要創建包含Foo類列表的根類

公共類RootWrapper {

private List<Foo> foo;

public List<Foo> getFoos() {
    return channels;
}

@JsonProperty("response")
public void setFoos(List<Foo> fooList) {
    this.foo= fooList;
}


RootWrapper mj = mapper.readValue(jsonStr, RootWrapper.class);

干杯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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