【问题标题】:How to extract a specific key-value pair for a complex-nested json structure using Gson API如何使用 Gson API 为复杂嵌套的 json 结构提取特定的键值对
【发布时间】:2016-04-26 20:29:47
【问题描述】:

我的最终目标是制作一个带有作者名称和从下面的 Json 中提取的值的地图(param1 和 param2 的英文值)。例如:{(S-W: 5000 W),(R-W: 5800 W)}

string =  

[
    {
        "title":"Specifications",
        "sort":1,
        "specValues":[
            {
            "name":"xxx",
            "type":"yyy",
            "englishValue":"xx.0 lb",
            "metricValue":"yy.0 kg",
            "sort":4
            },
            {
            "name":"Param1",
            "type":"measurement",
            "englishValue":"5000.0 W",
            "metricValue":"5000.0 W",
            "sort":99
            },
            {
            "name":"Param2",
            "type":"measurement",
            "englishValue":"5800.0 W",
            "metricValue":"5800.0 W",
            "sort":99
            },
            {
            "name":"Frequency",
            "type":"measurement",
            "englishValue":"60.0 Hz",
            "metricValue":"60.0 Hz",
            "sort":99
            }
        ]
    }
]

这是我提取它的代码及其下面的错误:

public Map<String, String> parseGenGson(String jsonLine) {
     Map <String,String> generatorMap = new LinkedHashMap <String,String>();
     try {
        JsonElement jelement = new JsonParser().parse(jsonLine);

        JsonArray  jarray1 = jelement.getAsJsonArray();
        JsonArray jarray = (JsonArray) jarray1.get(2);
        JsonObject jobject1 = jarray.getAsJsonObject();
        JsonArray jarray2 = jobject1.getAsJsonArray("specValue");
        JsonObject jobject = jarray2.get(1).getAsJsonObject();
        String result1 = jobject.get("englishValue").toString();
        generatorMap.put("Running Watts",result1);
        jobject = jarray.get(2).getAsJsonObject();
        String result2 = jobject.get("englishValue").toString();
        generatorMap.put("Starting Watts",result2);         
        log.info("Map of generators" + generatorMap);
        return generatorMap;
     } catch (Exception e){
         log.error(e.getMessage());
         return generatorMap;
     }
    }

错误:

Index: 2, Size: 1

我使用的结构有些问题,我使用了 GSon API。有什么想法吗?

【问题讨论】:

    标签: java json dictionary gson


    【解决方案1】:

    第一行是抛出错误的那一行:

    JsonArray jarray = (JsonArray) jarray1.get(2);
    

    jarray1 仅包含一个元素(您的根对象,具有属性 titlesortspecValues 的那个)所以您得到的错误是有道理的。

    试试这样的:

    Map<String, String> generatorMap = new LinkedHashMap<String, String>();
    try {
        JsonElement jelement = new JsonParser().parse(jsonLine);
    
        JsonArray jarray1 = jelement.getAsJsonArray();
        JsonObject rootObject = (JsonObject) jarray1.get(0);
        JsonArray specValues = rootObject.getAsJsonArray("specValues");
    
        JsonObject first = (JsonObject) specValues.get(0);
        JsonObject second = (JsonObject) specValues.get(1);
    
        String result1 = first.get("englishValue").toString();
        generatorMap.put("Running Watts", result1);
        String result2 = second.get("englishValue").toString();
        generatorMap.put("Starting Watts", result2);
        return generatorMap;
    } catch (Exception e) {
        log.error(e.getMessage());
        return generatorMap;
    }
    

    【讨论】:

      【解决方案2】:
          JsonArray  jarray1 = jelement.getAsJsonArray();
          JsonArray jarray = (JsonArray) jarray1.get(0);
          JsonObject jobject1 = jarray.getAsJsonObject();
          JsonArray jarray2 = jobject1.getAsJsonArray("specValue");
          JsonObject jobject = jarray2.get(0).getAsJsonObject();
          String result1 = jobject.get("englishValue").toString();
          generatorMap.put("Running Watts",result1);
          jobject = jarray.get(1).getAsJsonObject();
      

      阅读文档 JsonArray get 方法继承自 java.util.List 所以第一个元素是索引 0。试试这个,让我知道!

      【讨论】:

      • 很好,但我仍然遇到同样的错误。让我想到将某些东西错误地视为数组。
      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 2019-12-20
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多