2

私はAndroidRESTクライアントを開発しています。データ交換形式としてJSONを使用しているため、Jacksonパーサーを使用します。単純な配列のように、サーバーからさまざまなJson応答を受け取ります。

{"user_id":"332","user_role":"1"} 

または、他の何か。私が解析するこれらすべてのものLinkedHashMap<String, Object>とすべてが完全に機能しますが、サーバーからこの応答を受け取ったとき:

[ { "user_id":"352",
    "user_role":"expert",
    "name":"Test 12-18",
    "description":"Test" },

  { "user_id":"263",
    "user_role":"novice lab",
    "name":"Tom's Desk",
    "description":"Desk"}
]

解析後にnull:{}が発生しました。Jacksonを使用するコードは次のとおりです。

 ObjectMapper mapParametersToJSON = new ObjectMapper();
 String serverResponseBody = responseFromServer.getBody();
LinkedHashMap<String, Object> resultofOperation = new LinkedHashMap<String,
     Object>();
TypeReference<LinkedHashMap<String,Object>> genericTypeReferenceInformation = new
    TypeReference<LinkedHashMap<String,Object>>() {};
    try {
     resultofOperation =  mapParametersToJSON.readValue(serverResponseBody,
         genericTypeReferenceInformation);

では、なぜジャクソンはこれを解析できなかったのでしょうか。どうすればこれを修正できますか?

4

4 に答える 4

5

他の人は問題を示唆していますが、解決策は少し不完全です。JSONオブジェクトと配列を処理する必要がある場合は、にバインドするjava.lang.Objectか、タイプを確認することができます。

Object stuff = objectMapper.readValue(json, Object.class);

Listそして、またはのいずれかを取得しますMap(具体的には、ArrayListまたはLinkedHashMap、デフォルトで、これらのデフォルトは変更できます)。

または、次のコマンドでJSONツリーを実行できますJsonNode

JsonNode root = objectMapper.readTree(json);
if (root.isObject()) { // JSON Object
} else if (root.isArray()) { ...
}

多くの場合、後者の方が便利です。

良い点の1つは、これらから通常のPOJOを作成できることです。次に例を示します。

if(root.isObject()){MyObject ob = objectMapper.treeToValue(MyObject.class); } //またはObject、を使用してobjectMapper.convertValue(ob, MyObject.class)

そのため、タイプごとに異なる処理を行うこともできます。さまざまな表現を行ったり来たりします。

于 2013-03-12T17:02:13.947 に答える
4

質問の最初のJSONは、マップまたはオブジェクトです。2番目は配列です。配列を解析しているのではなく、マップを解析しているのです。

あなたはこのようなことをする必要があります:

List<MyClass> myObjects = mapper.readValue(jsonInput, new TypeReference<List<MyClass>>(){});

ここで答えとほぼ同じ質問。

于 2013-03-12T16:17:10.280 に答える
0

構造は参照に[]変換できず、配列内でのみ変換できるため、エラーが発生しています。MapList

私はそれをこのようにすることをお勧めします:

ObjectMapper objectMapper = new ObjectMapper();

List<Map<String,String>> parsedResult = objectMapper.reader(CollectionType.construct(LinkedList.class, MapType.construct(LinkedHashMap.class, SimpleType.construct(String.class), SimpleType.construct(String.class)))).readValue(serverResponseBody);

//if you need the one result map
Map<String, String> resultMap = new LinkedHashMap<String, String>();

for (Map<String, String> map: parsedResult){
    resultMap.putAll(map);
}
于 2013-03-12T16:24:36.513 に答える
0

JSONでは、isObject{"key": "value"}["this", "that"]isArrayです。

したがって、オブジェクトの配列を受け取っている場合は、のようなものを使用する必要がありますList<Map<Key, Value>>

于 2013-03-12T16:19:41.340 に答える