1

JSON レスポンス

ケース 1: 要素が 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 オブジェクトに非整列化します。2 種類の応答が可能であるため、Jackson パーサーはケース 1 の応答に対して正しく機能していません。

両方のケースを正しく処理し、JSON 応答をバインドするにはどうすればよいですか?

4

2 に答える 2

1

解決策を見つけました。JAXBJSONシリアライザーを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 に答える
1

上記の場合、カスタムコーディングが必要なようです

リストを次のようにマッピングします

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

PersonSerializer を実装する

         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 に答える