0

私は Jackson と Json にかなり慣れていませんが、主にオブジェクトマッパーを使用して、常に独自のクラスを定義し、非常にオブジェクト指向で作業しています。最近、Android プログラミングを独学で学び、その過程で、応答に JSON エンコーディングを使用するサードパーティの Web サービスからデータをクエリすることにしました。それらの返信の1つが私を混乱させます。

いくつかのオブジェクトを照会すると、次のような結果が得られます。

JSON: 
[
  {"num":"2","total":"2"},
  {"id":"1234", ...more fields...},
  {"id":"1235", ...more fields...}
]

これは、私の標準的なジャクソンのアプローチではうまく解析できないものです。なぜなら、私がそれを読んだ方法から、これは最初の要素が次の要素の型とは異なる型である配列の開始を示しているからです。現在、これを POJO としてモデル化して、標準の Jackson マッピングを許可することはできません。(そして正直なところ、これが正しい構文だとは思いませんでした) 基本的な文字列編集でこれを簡単に回避できますが、何かを誤解しているに違いないと思います。これがばかげた質問である場合は、ご容赦ください。ご協力いただきありがとうございます。返信をお待ちしております。

編集1:私の自己疑いを確認してくれたHot Licksに感謝します=)。誰かがジャクソンでこれをモデル化する適切な方法を提案できますか、それともこれは本当にジャクソンがJSONよりも具体的なケースですか?

4

1 に答える 1

1

これには 2 つの部分があります。

  1. それは合法的なJSONですか
  2. それは賢明なデータ表現ですか

最初の質問の答えは「はい」です。2つ目は主観的です。非常に一般的な「マップのリスト」を除いて、Java(またはJavascript)には実際の型付き構造がないため、「いいえ」と主張します。したがって、実際にはオブジェクト モデルではなく、単なる JSON の奇妙なデータ モデルです。

したがって、Jacksonを使用してこれを次のようなものにバインドできることは明らかです。

List<Map<String,Object>> list = (List<Map<String,Object>>) mapper.readValue(jsonSource, List.class);

ちょっと使いづらいでしょう。

でも。2段階の処理を使用できます。最初に上記の「型なし」リストに入れます。次に、次のように、マップを実際のオブジェクトに変換します。

Iterator<Map<String,Object>> it = list.iterator();
HeaderOb header = mapper.convertValue(it.next(), HeaderOb.class); // has 'num' and 'total'
while (it.hasNext()) {
  ValueOb value = mapper.convertValue(it.next(), ValueOb.class); // has 'id', others
}

単一フェーズのメソッドがない理由は、上記の JSON 構造に自然なオブジェクト マッピングがないからです。それを設計した人は誰でも、そのような構造を選択することの意味を考えていなかったか、おそらくオブジェクト指向にあまり熟達していませんでした。

価値のあるものとして、JSON サンプルに含まれるものに使用されるより一般的なモデルは次のようになります。

{
  "num" : 2,
  "total" : 2,
  "entries" : [
     { "id": ... },
     ...
  ]
}

Java オブジェクトにも簡単にマップできます。

于 2012-06-05T05:14:12.990 に答える