解析gson中的动态Json对象

kb5ga3dv  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(217)

我有这样的json结构,我如何在Gson的帮助下解析json。我需要在json对象中存储键值,我尝试了许多与动态数组相关的例子,但是没有方括号的动态json数组我无法使用Gson进行解析。有什么解决方案或需要手动解析Json吗?如果有人觉得重复,请在下面评论答案。

{ "Result":[[
      "Title",
      {
        "0": 1323,
        "1": 3358,
        "2": 2123,
        "3": 8536,
        "4": 1399,
        "5": 9303,
        "7": 9732,
        "8": 3433,
        "9": 1383
      }
    ],[
      "Title",
      {
        "0": 1323,
        "1": 3358,
        "2": 2123,
        "3": 8536,
      }
    ]]}
qco9c6ql

qco9c6ql1#

首先,JSON会引发异常,因为它是无效的--在第二个示例中,最后一个值的末尾有一个额外的逗号。"3": 8536,应该是"3": 8536
在解决了这个问题之后,只要你正确地定义了你的对象,这应该是一个简单的任务。

public class Results {
    @SerializedName("Result")
    List<Result> results;
}

public class Result {
    String title;
    Map<String, Integer> results;
}

从这里开始,Result类需要以一种特殊的方式进行反序列化,因为Result类中的字段并不直接Map到JSON中的条目。相反,我们需要提取每个Result中包含的JsonArray的第一个和第二个元素,并相应地解析它。看起来像这样:

public class ResultDeserializer implements JsonDeserializer<Result> {

    @Override
    public Result deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonArray array = json.getAsJsonArray();

        Result result = new Result();
        result.title = array.get(0).getAsString();

        result.results = new LinkedHashMap<String, Integer>();
        for(Entry<String, JsonElement> entry : array.get(1).getAsJsonObject().entrySet()) {
            result.results.put(entry.getKey(), entry.getValue().getAsInt());
        }

        return result;
    }   
}

请注意,我的示例省略了错误检查。最后,注册这个反序列化器,您应该已经准备好了:

Gson gson = new GsonBuilder().registerTypeAdapter(Result.class, new ResultDeserializer()).create();

Results results = gson.fromJson(json, Results.class);

for(Result r : results.results) {
    System.out.println("Title = " + r.title);
    for(Entry<String, Integer> entry : r.results.entrySet()) {
        System.out.println("\t " + entry.getKey() + " -> " + entry.getValue());
    }
}

这将打印:

Title = Title
     0 -> 1323
     1 -> 3358
     2 -> 2123
     3 -> 8536
     4 -> 1399
     5 -> 9303
     7 -> 9732
     8 -> 3433
     9 -> 1383
Title = Title
     0 -> 1323
     1 -> 3358
     2 -> 2123
     3 -> 8536

我将把它留给OP来实现相反的操作,即Result的串行化器来生成相同的结果。

xeufq47z

xeufq47z2#

在 * * Gson * * 中 使用 * * 嵌套 Map * * 找到 解析 上述 json 的 简单 方法

    • 结果 . java * *
public class Result {
    @SerializedName("formatted_facet_fields")
    Map<String,Map<String,String>> formatted_facet_fields;
}

中 的 每 一 个
响应 接收 方

Gson  gson=new Gson();
 Result result = gson.fromJson(json_response, Result.class);

格式

u1ehiz5o

u1ehiz5o3#

是的,您可以解析嵌套的json对象。

if (!exists) {
        keys = json.keys();
        while (keys.hasNext()) {
            nextKeys = (String) keys.next();
            try {

                if (json.get(nextKeys) instanceof JSONObject) {

                    if (exists == false) {
                        getKey(json.getJSONObject(nextKeys), key);
                    }

                } else if (json.get(nextKeys) instanceof JSONArray) {
                    JSONArray jsonarray = json.getJSONArray(nextKeys);
                    for (int i = 0; i < jsonarray.length(); i++) {
                        String jsonarrayString = jsonarray.get(i).toString();
                        JSONObject innerJSOn = new JSONObject(jsonarrayString);

                        if (exists == false) {
                            getKey(innerJSOn, key);
                        }

                    }

                }

            } catch (Exception e) {
                // TODO: handle exception
            }

        }

要完全理解,请查看以下内容:代码说明:https://www.youtube.com/watch?v=ZjZqLUGCWxo

相关问题