【问题标题】:Java - JSON with undefined KeysJava - 带有未定义键的 JSON
【发布时间】:2014-01-02 12:33:25
【问题描述】:

我必须在不知道密钥的情况下读取 JSON。

我的 JSON 是这样的:

{
 "hello": {
   "bye": {
    "a": "1",
     "b": "2",
     "c": "3"
   },
   "d": "4",
   "e": "5"
 },
 "hey": {
  "qwer": {
     "asdf": "1",
     "fda": "2",
     "bc": "3"
   },
   "dq": "4"
 }
}

只有更多的数据和更多的元素。

我想像使用路径的地图一样访问它们,例如

get() for hello&hey, 

get("hello") for bye,d&e, 

get("hello","bye") for a,b&c

...

希望你理解我,我通常使用 Gson 来解析 JSON 但传递一个对应的类(如AClass c = new Gson.fromJson(myJson, AClass.class);),但不知道 JSON 结构,我不能使用这种方法。

如果我可以轻松地在某处删除和添加条目,那就太好了。

【问题讨论】:

  • 我想你忘记发布你的编程问题了。
  • 这是一张地图。您可以遍历 Map 的键。
  • ... 那么问题是什么?
  • 我想像地图一样访问它们,但我不知道如何,我只有一个巨大的 json (2mb),我找不到任何 gson 访问数据的东西
  • 你不知道如何使用常规的 JSON 解析器???

标签: java json map


【解决方案1】:

要做你需要的,你仍然可以使用 Gson,但你需要一个更“低级”的类,比如JsonParser

在这里,我为您提供了一个示例,说明如何导航解析器生成的JsonElement 树以到达请求的节点。它仅适用于您请求的语法(node1/node2/..),但您也可以轻松适应以下情况:node1/3/node3/4/2,其中数字表示孩子。

当您到达节点时,如果需要,您可以使用 Gson 进行解析,因为您也可以将 JsonElement 传递给 Gson::fromJson。代码如下:

package stackoverflow.questions;

import java.util.*;

import com.google.gson.*;

public class Q20883087 {

  public static JsonElement get(JsonElement je, String...  args){
     if(args.length == 0)
        return je;

     if (je != null && je.isJsonObject()){
        String[] newArgs = Arrays.copyOfRange(args, 1, args.length);
       return get(je.getAsJsonObject().get(args[0]), newArgs); 
     }


   }

   public static void main(String[] args) {
      String json ="{                          "+
      "   \"hello\": {            "+
      "     \"bye\": {            "+
      "      \"a\": \"1\",        "+
      "       \"b\": \"2\",       "+
      "       \"c\": \"3\"        "+
      "     },                    "+
      "     \"d\": \"4\",         "+
      "     \"e\": \"5\"          "+
      "   },                      "+
      "   \"hey\": {              "+
      "    \"qwer\": {            "+
      "       \"asdf\": \"1\",    "+
      "       \"fda\": \"2\",     "+
      "       \"bc\": \"3\"       "+
      "     },                    "+
      "     \"dq\": \"4\"         "+
      "   }                       "+
      "  }                        ";

      JsonElement jsonElement = new JsonParser().parse(json);

      System.out.println(get(jsonElement, "hello","bye"));
      System.out.println(get(jsonElement, "hey","qwer"));




   }

}

结果是:

{"a":"1","b":"2","c":"3"}
{"asdf":"1","fda":"2","bc":"3"}

注意get方法的递归性质,由于Json本质上是递归的,管理它的最好方法是使用递归方法。

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2020-12-06
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多