1

以下のような構造で構成される JSON 文字列があります。基本的に、VO のチェーンがあり、各 VO には VO のリストと VO のマップもあります。

サンプル:

"MessageHeader": {
    "type": "new",
    "id": 10,
    "add_record": "true",
},
"MessageBody": {
    "dob_required": false,
    "dept_name": "Purchase",
    "group": {
        "main_group": "main group",
        "sub_group": "sub group"
    },
    "family_info": {
        "person1": {
            "name": "HisName",
            "gender": "male",
            "age": "31",
            "office_info_present": {
                "office_name": "present office",
                "office_address": "some address"
                "some_other_vo":{

                },
            },
            "office_info_previous": {
                "office_name": "old office",
                "office_address": "some address"
            },            
        },
        "person2": {
            "name": "HerName",
            "gender": "Female",
            "age": "25",
        }
    },
    "active":true
}

すべての属性名とその値をキーと値のペアで出力したいと思います。VO 名を出力したくはなく、終了属性 (リーフ レベルの属性) だけを出力したい

以下の文字列のように:

type=new id=10 add_record=true dob_required=false dept_name=purchase main_group="メイングループ" sub_group="サブグループ" name=彼の名前 性別=男性 年齢=31 .... 名前=彼女の名前 性別=女性 年齢=25

これはどのように行うことができますか?ジャクソンを使用してそれを行うことができれば幸いです。それ以外でも結構です。

4

3 に答える 3

2

最も簡単な方法はおそらく、Jackson のツリー モデルを使用してトラバースすることです。何かのようなもの:

JsonNode root = mapper.readValueAsTree(jsonInput);
Map<String,String> flat = new HashMap<String,String>();
traverse(root, flat);

public void traverse(JsonNode node, Map<String,String> result)
{
   Iterator<Map.Entry<String,JsonNode>> it = node.fields();
   while (it.hasNext()) {
     Map.Entry<String,JsonNode> entry = it.next();
     JsonNode n = entry.getValue();
     if (n.isObject()) { // if JSON object, traverse recursively
       traverse(n);
     } else { // if not, just add as String
       result.put(entry.getKey(), n.asText());
     }
   } 
}

印刷できるマップが表示されます。

于 2013-05-31T23:14:08.303 に答える
1

このリンクを使用して、応答用の POGO クラスを作成できます。応答用のクラスが自動的に生成されます。

Google GSON ライブラリを使用 して応答を解析します。

于 2013-05-29T09:43:19.600 に答える
0

はい、ジャクソンを使用して解析できます。しかし、それは簡単ではありません。XML 用の JAXB に類似した実装はほとんどありません。しかし、私はそれらをテストしたことはありません。これが大まかなコード スニペットです。

JSONParser parser = new JSONParser();

    try {

        JSONObject jsonObject = (JSONObject) parser.parse(new FileReader("c:\\sample.json"));

        String name = (String) jsonObject.get("name");
        long age = (Long) jsonObject.get("age");
        JSONArray msg = (JSONArray) jsonObject.get("messages");
        System.out.println("Name:"+name);
        System.out.println("Age:"+age);
        System.out.println("Messages:");
        Iterator<String> iterator = msg.iterator();
        while (iterator.hasNext()) {
        System.out.println(iterator.next());
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }
于 2013-05-29T12:13:53.440 に答える