【问题标题】:How to parse JSON file?如何解析 JSON 文件?
【发布时间】:2010-06-08 19:55:50
【问题描述】:

简单的情况-

  1. 读取一个json文件
  2. 发现所有键值对
  3. 比较键值对

我尝试了来自 json.org 的包 gson,但似乎无法做到。

有人可以提供一个清晰的 Java 示例,说明如何获取文件、读取文件、以 json 对象结尾,我可以从中获取键/值对。

考虑一下:

private void runThroughJson(JsonObject jsonObject) {
    for (final Entry<String, JsonElement> entry : jsonObject.entrySet()) {

        final String key = entry.getKey();
        final JsonElement value = entry.getValue();

        System.out.println(key + " - " + value);

        if (value.isJsonObject()) {
            runThroughJson(value.getAsJsonObject());
        } else {                
            int ix = value.getAsString().indexOf('[');
            int ig = value.getAsString().lastIndexOf(']');

            System.out.println(ix);
            System.out.println(ig);

            String a = value.getAsString().substring(ix, ig);
            JsonElement jsonElement = parser.parse(a);
            runThroughJson(jsonElement.getAsJsonObject());
        }
    }
}

从逻辑上讲,这似乎没问题,但是,我得到了一个例外:

Exception in thread "main" java.lang.IllegalStateException
    at com.google.gson.JsonArray.getAsString(JsonArray.java:133)
    at com.cme.esg.bk.TryGson.runThroughJson(TryGson.java:46)
    at com.cme.esg.bk.TryGson.runThroughJson(TryGson.java:44)
    at com.cme.esg.bk.TryGson.goForIt(TryGson.java:32)
    at com.cme.esg.bk.TryGson.main(TryGson.java:16)

你能告诉我我失踪了吗。

【问题讨论】:

    标签: java json


    【解决方案1】:

    使用 Gson(假设您在 json 文件的顶层有对象 {...}):

    final JsonParser parser = new JsonParser();
    final JsonElement jsonElement = parser.parse(new FileReader("/path/to/myfile"));
    final JsonObject jsonObject = jsonElement.getAsJsonObject();
    
    for (final Entry<String, JsonElement> entry : jsonObject.entrySet()) {
       final String key = entry.getKey();
       final JsonElement value = entry.getValue();
       ....
    }
    

    回应您的评论:

    您当然应该避免从字符串中重新解析 json。使用类似的东西:

    ... else if (value.isJsonArray()) {
       final JsonArray jsonArray = value.getAsJsonArray();
       if (jsonArray.size() == 1) {
          runThroughJson(jsonArray.get(0));
       } else {
            // perform some error handling, since
            // you expect it to have just one child!
       }
    
    } 
    

    【讨论】:

    • 克里斯——你太棒了。非常感谢您的帮助!
    • 我将使用递归深入到内部元素。 gson 是否提供删除 [] 的方法?
    • 我不确定我是否理解“drop []”在这种情况下的含义,但您始终可以使用value.isJsonArray() 检查当前元素是否为数组,然后决定丢弃它。
    • JsonObject 以 {} 开始和结束。当我向下钻取时,我看到了 [{}]。在这种情况下,我想在两边修剪 [] if (value.isJsonObject()) { loop(value.getAsJsonObject()); } else { int ix = value.getAsString().indexOf('['); int ig = value.getAsString().lastIndexOf(']');字符串 a = value.getAsString().substring(ix, ig); JsonElement jsonElement = parser.parse(a);循环(jsonElement.getAsJsonObject()); }
    【解决方案2】:

    我们使用 Jaskson 解析器,示例代码如下:

    protected T getJsonObject(InputStream inputStream, Class<T> className) throws JsonParseException,
          JsonMappingException, IOException {
        // Deserialize input to Json object
        ObjectMapper mapper = new ObjectMapper();
    
        T jsonSource = mapper.readValue(inputStream, className);
        return jsonSource;
    }
    

    这里是如何调用它的代码:

    JsonEmployee jsonEmployee = getJsonObject(inputStream, JsonEmployee.class);
    

    JsonEmployee.java 只是 POJO

    【讨论】:

      【解决方案3】:

      XStream 适用于 JSON: http://x-stream.github.io/json-tutorial.html

      由于 XStream 的灵活架构,处理 JSON 映射就像处理 XML 文档一样简单。您所要做的就是使用适当的驱动程序初始化 XStream 对象,然后您就可以将对象序列化为(和从)JSON。

      【讨论】:

        猜你喜欢
        • 2023-02-14
        • 1970-01-01
        • 2018-04-07
        • 2016-06-19
        • 1970-01-01
        • 2021-07-17
        • 2015-07-10
        相关资源
        最近更新 更多