简体   繁体   English

如何解析JSON文件?

[英]How to parse JSON file?

Simple situation - 简单的情况 -

  1. read a json file 读一个json文件
  2. discover all key-value pairs 发现所有键值对
  3. compare key-value pairs 比较键值对

I tried gson, package from json.org, but can't seem to get far with it. 我试过gson,来自json.org的软件包,但似乎无法与之相提并论。

Can someone please provide a clear sample in Java on how to take a file, read it, end up with json objec I can get key/value pairs from. 有人可以在Java中提供一个关于如何获取文件的清晰样本,阅读它,最后使用json objec我可以从中获取键/值对。

Consider this: 考虑一下:

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());
        }
    }
}

Logically, it seems alright, however, i get an exception: 从逻辑上讲,它似乎没问题,但是,我得到一个例外:

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)

Can you please advise that am i missing. 你能告诉我我错过了吗?

With Gson (assuming that you have on object {...} on the top level of your json file): 使用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();
   ....
}

In response to your comment: 回应你的评论:

You should certainly avoid re-parsing the json from a string. 你当然应该避免从字符串重新解析json。 Use something like: 使用类似的东西:

... 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!
   }

} 

We use Jaskson parser, here are the sample code: 我们使用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;
}

Here is the code how to invoke it: 以下是如何调用它的代码:

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

JsonEmployee.java is just POJO JsonEmployee.java只是POJO

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

Due to XStream's flexible architecture, handling of JSON mappings is as easy as handling of XML documents. 由于XStream的灵活架构,JSON映射的处理就像处理XML文档一样简单。 All you have to do is to initialize XStream object with an appropriate driver and you are ready to serialize your objects to (and from) JSON. 您所要做的就是使用适当的驱动程序初始化XStream对象,并准备将对象序列化为(和)JSON。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM