【问题标题】:How to Parse JSON with dynamic Keyname?如何使用动态键名解析 JSON?
【发布时间】:2014-12-22 13:05:33
【问题描述】:

我有一个这样的 JSON 响应。

{
"array": [
    {
        "object1": {
            "aa": "somevalue1",
            "bb": "somevalue2",
            "cc": "somevalue3"
        }
    },
    {
        "object2": {
            "aa": "somevalue4",
            "bb": "somevalue5",
            "cc": "somevalue6"
        }
    }
]}

现在我可以从上面的响应中得到一个 JSON 数组。我想在for loop 中从对象object1object2 中读取值aa,bb,cc

JSON 是动态的,我的意思是 object2 也可以出现在 object1 之前(以相反的顺序),我可能会得到一个结构相同的对象(object3)或只有一个(@987654331) @ 或 object2object3)。

我不想这样做,因为我失败了:

JSONArray jsonArray = json.getJSONArray("array");
for (int i = 0; i < jsonArray.length(); i++) 
{
    JSONObject jsonObject = jsonArray.getJSONObject(i).getJSONObject("object1");
}

所以我的问题是如何在不依赖对象名称或对象数量(object1object2object3)的情况下读取这些值 aa,bb,cc

【问题讨论】:

    标签: java json


    【解决方案1】:

    看起来数组中的每个项目只有 1 个键/值对,其中包含另一个 json 对象,然后有几个。

    如果是这种情况,那么您可能会这样做:

    for (int i = 0; i < jsonArray.length(); i++)
    {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
    
        JSONObject innerObject = jsonObject.getJSONObject(jsonObject.keys().next().toString());
    
        /// do something with innerObject which holds aa, bb, cc
    }
    

    您只需抓取包装对象中的第一个键,然后使用它来抓取内部 json 对象。

    【讨论】:

    • 谢谢,我正在搜索如何动​​态获取键名,这样我就可以跳过写getJSONObject("object1")getJSONObject("object2")。再次感谢
    【解决方案2】:

    我认为你应该有下一个 Java 端的类结构:

    1. Entity - 将包含 aabbcc 字段的类

    2. Container - 一个包含两个字段的类 - NameEntity,其中 Name 可以存储 object1object2 或其他任何内容。

    然后,您应该将提供的 JSON 反序列化为 Container 实体的集合/数组。

    希望这会有所帮助。

    更新:请查看此示例Collection deserialization

    【讨论】:

      【解决方案3】:

      您应该使用像java.util.Map 这样的动态结构。试试这个:

      import java.util.List;
      import java.util.Map;
      
      import org.apache.commons.lang.StringUtils;
      import org.codehaus.jackson.map.ObjectMapper;
      import org.codehaus.jackson.type.TypeReference;
      
      public class JsonTest {
      
          public static void main(String[] args) {
              String json = "{\"array\": [{\"object1\": {\"aa\": \"somevalue1\",\"bb\": \"somevalue2\",\"cc\": \"somevalue3\"}},{\"object2\": {\"aa\": \"somevalue4\",\"bb\": \"somevalue5\",\"cc\": \"somevalue6\"}}]}";
              System.out.println(json);
              final MyJson parseJsonSpecification = parseJsonSpecification(json);
              System.out.println(parseJsonSpecification.array.get(0).get("object1"));
              System.out.println(parseJsonSpecification);
          }
      
          public static MyJson parseJsonSpecification(String jsonString) {
              try {
                  if (StringUtils.isBlank(jsonString)) {
                      return new MyJson();
                  }
                  MyJson ret;
                  ret = new ObjectMapper().readValue(jsonString, new TypeReference<MyJson>() {
                  });
                  return ret;
              } catch (Exception ex) {
                  throw new IllegalArgumentException("La expresión '" + jsonString + "' no es un JSON válido", ex);
              }
          }
      }
      
      class MyJson {
          public List<Map<String, Object>> array;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 2019-06-10
        • 1970-01-01
        • 2020-07-28
        • 2018-12-25
        相关资源
        最近更新 更多