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

时间:2014-03-13 15:10:54

标签: java android json jackson

以下是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与期望不匹配(&#39; List&#39;)。此外,如果我使用readTree函数需要5秒(但不是命中异常)。有没有更好的方法让对象更快,

此外,我还无法计算如何在Foo对象中映射Bar对象列表。我可以使用以下代码行设置我的属性:

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

所以我有我的Foo对象列表,但是我无法使用simmilar的东西获取列表中的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]

2 个答案:

答案 0 :(得分:1)

由于您似乎将响应包装在单成员对象实例中,因此您可以选择使用以下内容注释Foo类:

@JsonRootName("MyMethodResponse")

重要提示:名称已修复。

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

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE);

你还有另外一个问题。也就是说,您的List<Bar>在您的POJO中的名称为myBar,但在生成的JSON中为Bar。您需要使用myBar注释@JsonProperty字段:

@JsonProperty("Bar")

答案 1 :(得分:0)

如果有人遇到同样的问题,我想出来了。如果JSON格式为

,则序列化Foo类
{"response":[{"propertyOfFooClass":"something"
}]
} 

您需要创建包含Foo类列表

的根类

public class 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);

干杯