如何迭代jsonobject(gson)

rslzwgfq  于 2021-07-03  发布在  Java
关注(0)|答案(5)|浏览(472)

我有一个jsonobject

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

JsonObject 包含 "id" 项,但其他键/值对的数目尚未确定,因此我要创建一个具有2个属性的对象:

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

所以我希望我的属性Map像这样:

"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?",
}

beq87vna

beq87vna1#

我不太清楚你为什么首先要做手工操作。gson decode将把那些缺少的键/值对作为默认值(零,null)。然后你就可以随心所欲了。

4szc88ey

4szc88ey2#

将“”替换为空白。

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("\"",""));
    }
   }
nkhmeac6

nkhmeac63#

只需做以下更改。。。

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”将为你带来魔力

6gpjuf90

6gpjuf904#

如何创建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);
    }
qvtsj1bj

qvtsj1bj5#

你的Map值是 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 生产其他类型的产品。

相关问题