java - 使用最新的 Jackson Parser 库在 Android 设备上解析 JSON

标签 java android json jackson

以下是 JSON 响应 str 的示例:

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

服务正在返回列表

List<Foo> myServiceMethod(){

return new List<Foo> myFooList
}

这是类(class):

@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 对象列表。我可以使用这行代码设置我的属性:

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

所以我有 Foo 对象列表,但我无法使用类似的东西获取列表内部的列表。任何有关持续时间问题或设置内部列表对象的帮助将不胜感激

追踪:

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")

重要提示:名称已固定。

但是你还没有完成。您需要配置您的ObjectMapper使用此注释:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE);

您还有另一个问题。即,您的List<Bar>有名字myBar在你的 POJO 中,但是 Bar在生成的 JSON 中。您需要注释您的 myBar字段 @JsonProperty :

@JsonProperty("Bar")

关于java - 使用最新的 Jackson Parser 库在 Android 设备上解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22382932/

相关文章:

java - 处理后内存未释放

java - 第 35 行的 HTTP 状态 500

java - 使用动态规划找零钱

java - 将 Json 传递给 Rest 并通过 JSONObject 接收

android - 对于 seg faults 的原生 android 应用程序,为什么 logcat 中没有堆栈跟踪?

android - 运行一段时间后,SurfaceView破坏Surface

Android tabHost 访问特定的标签

javascript - Angular JS 在 ng-repeat 中设置点击对象的值

android - getjson 响应在 phonegap 中返回 null (android)

javascript - 使用 json 内容对网格进行排序