1

JSON 响应

情况1:只有一个元素存在

{
"Person": {
    "first": "foo",
    "last": "bar"
}
}

情况2:存在多个元素(即)正确的数组类型

{
"Person": [
    {
        "first": "foo",
        "last": "bar"
    },
    {
        "first": "cow",
        "last": "pal"
    }
]
}

生成上述我无法控制的响应的 JAXB 代码。

@XmlRootElement
public class PersonContainer {

@XmlElement
List<Person> personList;
}

我使用 Jackson 解析器的 JAXB 功能将 JSON 解组为 JAXB 对象。由于有两种类型的响应是可能的,Jackson 解析器对于案例 1 响应不能正常工作。

如何正确处理这两种情况并绑定 JSON 响应?

4

2 回答 2

1

对于上述情况,似乎需要一些自定义编码

使用以下内容映射列表

          @JsonDeserialize(using=PersonSerializer.class)
          List<Person> personList;

实现 PersonSearializer

         public class PersonSerializer extends JsonDeserializer<List<Person>>{

public List<Person> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
    throws IOException, JsonProcessingException {
     ObjectCodec oc = jsonParser.getCodec();
     JsonNode node = oc.readTree(jsonParser);
     Iterator<JsonNode>  iterator = node.getElements();

     List<Person> list = new ArrayList<Person>();
     while (iterator.hasNext()){
         JsonNode j = iterator.next();
         Person nr = new Person();
         if (j.get("first") == null) {
             nr.setFirstName(node.get("first").getTextValue()));
             nr.setLastName(node.get("last").getTextValue()));
             list.add(nr);
             break;
         }
         nr.setFirstName(j.get("first").getTextValue()));
         nr.setLastName(j.get("last").getTextValue()));
         list.add(nr);
     }

     return list;
}

}

于 2012-06-01T06:05:31.343 回答
1

我找到了一个解决方案:将 JAXB JSON 序列化器替换为像 Jackson 这样表现更好的 JSON 序列化器。简单的方法是使用 jackson-jaxrs,它已经为您完成了。该类是 JacksonJsonProvider。您所要做的就是编辑项目的 web.xml,以便 Jersey(或其他 JAX-RS 实现)扫描它。这是您需要添加的内容:

<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
  <param-value>your.project.packages;org.codehaus.jackson.jaxrs</param-value>
</init-param>

这就是它的全部。Jackson 将用于 JSON 序列化,它的工作方式与您期望的列表和数组一样。

它对我有用,确保你的类路径中有 jackson-jaxrs.jar。

参考: 如何自定义将 JAXB 对象列表序列化为 JSON?

于 2012-06-18T06:40:55.557 回答