使用GSONparsingJSON文件
我想使用GSON在JAVA中parsing这个JSON文件:
{ "descriptor" : { "app1" : { "name" : "mehdi", "age" : 21, "messages": ["msg 1","msg 2","msg 3"] }, "app2" : { "name" : "mkyong", "age" : 29, "messages": ["msg 11","msg 22","msg 33"] }, "app3" : { "name" : "amine", "age" : 23, "messages": ["msg 111","msg 222","msg 333"] } } }
但我不知道如何join到根元素: 描述符 ,之后是app3元素,最后是名称元素。
我遵循这个教程http://www.mkyong.com/java/gson-streaming-to-read-and-write-json/ ,但它并没有显示具有root和childs元素的情况。
Imo,用GSONparsing你的JSON响应的最好方法就是创build能够匹配你的响应的类,然后使用Gson.fromJson()
方法。
例如:
class Response { Map<String, App> descriptor; // standard getters & setters... } class App { String name; int age; String[] messages; // standard getters & setters... }
然后只使用:
Gson gson = new Gson(); Response response = gson.fromJson(yourJson, Response.class);
你的yourJson
可以是一个String
,任何Reader
, JsonReader
或者JsonElement
。
最后,如果你想访问任何特定的领域,你只需要做:
String name = response.getDescriptor().get("app3").getName();
您可以按照其他答案中的build议手动parsingJSON,但是我个人认为这种方法在长期内更清晰,更易于维护,而且更适合JSON的整体思路。
我使用的是gson 2.2.3
public class Main { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { JsonReader jsonReader = new JsonReader(new FileReader("jsonFile.json")); jsonReader.beginObject(); while (jsonReader.hasNext()) { String name = jsonReader.nextName(); if (name.equals("descriptor")) { readApp(jsonReader); } } jsonReader.endObject(); jsonReader.close(); } public static void readApp(JsonReader jsonReader) throws IOException{ jsonReader.beginObject(); while (jsonReader.hasNext()) { String name = jsonReader.nextName(); System.out.println(name); if (name.contains("app")){ jsonReader.beginObject(); while (jsonReader.hasNext()) { String n = jsonReader.nextName(); if (n.equals("name")){ System.out.println(jsonReader.nextString()); } if (n.equals("age")){ System.out.println(jsonReader.nextInt()); } if (n.equals("messages")){ jsonReader.beginArray(); while (jsonReader.hasNext()) { System.out.println(jsonReader.nextString()); } jsonReader.endArray(); } } jsonReader.endObject(); } } jsonReader.endObject(); } }
在解决这样的问题时要记住的一件事是,在JSON文件中, {
表示一个JSONObject
和一个[
表示JSONArray
。 如果能够正确地pipe理它们,那么完成parsingJSON文件的任务将是非常容易的。 上面的代码对我来说真的很有帮助,我希望这个内容给上面的代码增加一些含义。
Gson JsonReader文档解释了如何处理JsonObjects
和JsonArrays
parsing:
- 在数组处理方法中,首先调用beginArray()来使用数组的开始括号。 然后创build一个积累值的while循环,当hasNext()为false时结束。 最后,通过调用endArray()来读取数组的右括号。
- 在对象处理方法中,首先调用beginObject()来使用对象的左大括号。 然后创build一个while循环,根据名称为局部variables赋值。 当hasNext()为false时,此循环应该终止。 最后,通过调用endObject()来读取对象的右大括号。