web-dev-qa-db-ja.com

JSONObject(gson)を反復する方法

私はJsonObjectを持っています

JsonObject jsonObject = {"keyInt":2,"keyString":"val1","id":"0123456"}

すべてのJsonObjectには"id"エントリが含まれていますが、他のキーと値のペアの数は決定されていないため、2つの属性を持つオブジェクトを作成します。

class myGenericObject {
  Map<String, Object> attributes;
  String id;
}

だから私は私の属性マップを次のようにしたいです:

"keyInt" -> 4711
"keyStr" -> "val1"

私はこの解決策を見つけました

Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
  attributes.put(entry.getKey(), jsonObject.get(entry.getKey()));
}

値は""で囲まれています

"keyInt" -> "4711"
"keyStr" -> ""val1""

プレーンな値(4711および"val1")を取得する方法は?

入力データ:

{
  "id": 0815, 
  "a": "a string",
  "b": 123.4,
  "c": {
    "a": 1,
    "b": true,
    "c": ["a", "b", "c"]
  }
}

または

{
  "id": 4711, 
  "x": false,
  "y": "y?",
}
12
Floyd

「」を空白に置き換えます。

   Map<String, Object> attributes = new HashMap<String, Object>();
   Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
   for(Map.Entry<String,JsonElement> entry : entrySet){
    if (! nonProperties.contains(entry.getKey())) {
      properties.put(entry.getKey(), jsonObject.get(entry.getKey()).replace("\"",""));
    }
   }
9
atish shimpi

JsonObjectをどのように作成していますか?あなたのコードは私のために働きます。このことを考慮

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
...
...
...
try{
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("keyInt", 2);
        jsonObject.addProperty("keyString", "val1");
        jsonObject.addProperty("id", "0123456");

        System.out.println("json >>> "+jsonObject);

        Map<String, Object> attributes = new HashMap<String, Object>();
        Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
        for(Map.Entry<String,JsonElement> entry : entrySet){
          attributes.put(entry.getKey(), jsonObject.get(entry.getKey()));
        }

        for(Map.Entry<String,Object> att : attributes.entrySet()){
            System.out.println("key >>> "+att.getKey());
            System.out.println("val >>> "+att.getValue());
            } 
    }
    catch (Exception ex){
        System.out.println(ex);
    }

そして、それはうまく機能しています。今、私はあなたがあなたのそのJSONをどのように作成したかを知ることに興味がありますか?

これを試すこともできます(JSONObject)

import org.json.JSONObject;
...
...
...
try{
        JSONObject jsonObject = new JSONObject("{\"keyInt\":2,\"keyString\":\"val1\",\"id\":\"0123456\"}");
        System.out.println("JSON :: "+jsonObject.toString());

        Iterator<String> it  =  jsonObject.keys();
         while( it.hasNext() ){
             String key = it.next();
             System.out.println("Key:: !!! >>> "+key);
             Object value = jsonObject.get(key);
             System.out.println("Value Type "+value.getClass().getName());
            }
    }
    catch (Exception ex){
        System.out.println(ex);
    }
2

以下の変更を加えるだけです...

Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
 attributes.put(entry.getKey(), jsonObject.get(entry.getKey()).getAsString());
}

「getAsString」はあなたのための魔法を行います

2

マップの値は JsonElement sです。 JsonElementを出力するときはいつでも(例えば、デバッガーを使用して)その toString() メソッドが呼び出されます-JsonElementには多くの実装クラスがあるため、デフォルトのtoString実装は、値を引用符で囲んで、正しいJSONを保証します。値を通常のラップされていないStringとして取得するには、単純に getAsString() を呼び出します。

JsonElement elem;
// ...
String value = elem.getAsString();

あなたの例で:

Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
  attributes.put(entry.getKey(), jsonObject.get(entry.getKey()).getAsString());
}

他の型を生成するためにJsonElementを呼び出すことができる他の多くのメソッドがあることに注意してください。

1
Paul Benn

そもそもなぜ手動操作をしたいのかよくわかりません。 GSONデコードは、存在しないキー/値のペアをデフォルト値(ゼロ、null)のままにします。その後、必要に応じて処理できます。

0
Ted Xu