5

次のような JSON ファイルがあるとします。

{
"response" : [
    {
        "id" : "10",
        "period" : "month",
        "values" : [
             {
                 "value" : 100,
                 "date" : "2013-05-10"
             }
        ],
        "parent" : "1"
    },
    {
        "id" : "10",
        "period" : "day",
        "values" : [
             {
                 "value" : {
                        "foo" : 10,
                        "bar" : 11,
                        "etc" : 4
                 },
                 "date" : "2013-05-10"
             }
        ],
        "parent" : "1"
    },{
        "id" : "13",
        "period" : "year",
        "values" : [
             {
                 "value" : {
                        "info" : 1,
                        "pages" : 10,
                        "etc" : 4
                 },
                 "date" : "2013-05-10"
             }
        ],
        "parent" : "1"
    }
]
}

「値」部分は、単一の値またはオブジェクト (一意) のいずれかであることに注意してください。

Jackson ObjectMapper を使用して、これを POJO に簡単にマップしたいと考えています。

私がこれまでに持っているもの:

public class Response
{
    List<ResponseEntry> response;
    /*getters + setters */

    public static class ResponseEntry
    {
         private String id;
         private String period;
         private String parent;
         private List<Value> values;
         /*setters + getters*/

         public static class Value
         {
             private Object value;
             private String date;
             /*setters+getters*/
         }
    }
}

応答をマップするには、必要なファイルを指定し、ObjectMapper に「応答」クラスにマップするように指示するだけです

ObjectMapper mapper = new ObjectMapper();
Response r = mapper.readValues(json, Response.class);

これは機能しますが、「値」を保持するために「オブジェクト」を使用するよりも良い方法はありますか? 「値」は単一の値でもオブジェクトでもかまいません。これを処理するポリモーフィックな方法があると確信していますが、調べたところ、機能するものは見つかりませんでした。私はかなり立ち往生しており、助けていただければ幸いです。

4

1 に答える 1

3

残念ながら、処理している JSON の構造では、それを逆シリアル化する唯一の方法は、value属性を typeにすることObjectです。ただし、JSON が逆シリアル化されるvalueと、 がオブジェクトなのか単一の値なのかを簡単に判断できます。

JSON は、オブジェクト (Java ではマップ)、配列、文​​字列、数値、およびブール値の 5 つのデータ型のみをサポートすることに注意してください。valueあなたの場合、おそらく数値または数値のマップのように見えます。次に、チェックする可能性が 2 つあります。簡単なinstanceof比較を使用して、それがどのタイプの値であるかを把握できるはずです。

ObjectMapper mapper = new ObjectMapper();
Response r = mapper.readValues(json, Response.class);
Value val = r.response.get(0).values.get(0);
if (val.value instanceof Map)
    ; // multiple
else
    ; // single
于 2013-06-21T03:56:28.297 に答える