使用Gson for Java进行JSON解析

我想解析来自JSON类型为String 。 我正在使用Google Gson 。

我有:

 jsonLine = " { "data": { "translations": [ { "translatedText": "Hello world" } ] } } "; 

而我的课是:

 public class JsonParsing{ public void parse(String jsonLine) { // there I would like to get String "Hello world" } } 

这是简单的代码来做到这一点,我避免了所有的检查,但这是主要的想法。

  public String parse(String jsonLine) { JsonElement jelement = new JsonParser().parse(jsonLine); JsonObject jobject = jelement.getAsJsonObject(); jobject = jobject.getAsJsonObject("data"); JsonArray jarray = jobject.getAsJsonArray("translations"); jobject = jarray.get(0).getAsJsonObject(); String result = jobject.get("translatedText").toString(); return result; } 

为了使用更通用 – 你会发现Gson的javadocs非常清晰和有用。

在我的第一个gson应用程序中,我避免了使用额外的类来捕获值,主要是因为我使用json来进行配置

尽管缺乏信息(甚至是gson页面),但是我发现并使用了这些信息:

从…开始

 Map jsonJavaRootObject = new Gson().fromJson("{/*whatever your mega complex object*/}", Map.class) 

每次gson看到一个{},它都会创建一个Map(实际上是一个gson的StringMap)

每次gson看到一个“',它都会创建一个String

每次gson看到一个数字,它都会创建一个Double

每次gson看到一个[],它都会创建一个ArrayList

你可以使用这个事实(合并)给你的优势

最后,这是使事情的代码

  Map<String, Object> javaRootMapObject = new Gson().fromJson(jsonLine, Map.class); System.out.println( ( (Map) ( (List) ( (Map) ( javaRootMapObject.get("data") ) ).get("translations") ).get(0) ).get("translatedText") ); 

最简单的事情通常是创建匹配的对象层次结构,如下所示:

 public class Wrapper { public Data data; } static class Data { public Translation[] translations; } static class Translation { public String translatedText; } 

然后使用GSON绑定,通过字段遍历对象层次结构。 添加getter和setter对于基本的数据容器是没有意义的。

所以像这样:

 Wrapper value = GSON.fromJSON(jsonString, Wrapper.class); String text = value.data.translations[0].translatedText; 

你可以为json对象创建相应的java类。 整数,字符串值可以按原样映射。 Json可以像这样解析 –

 Gson gson = new GsonBuilder().create(); Response r = gson.fromJson(jsonString, Response.class); 

以下是一个示例 – http://rowsandcolumns.blogspot.com/2013/02/url-encode-http-get-solr-request-and.html

用Gson解决
我会在json字符串中为个别参数创建一个类。 或者,您可以创建一个名为“Data”的主类,然后类似地创建内部类。 为了清晰起见,我创建了单独的类

这些课程如下。

  • 数据
  • 翻译
  • TranslatedText

在类JsonParsing方法“解析”中,我们调用gson.fromJson(jsonLine, Data.class) ,它将使用Reflection来转换java对象中的字符串。

一旦我们访问“数据”对象,我们可以单独访问每个参数。

没有机会测试这个代码,因为我离开我的开发机器。 但这应该有所帮助。

一些很好的例子和文章。
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide

 public class JsonParsing{ public void parse(String jsonLine) { Gson gson = new GsonBuilder().create(); Data data = gson.fromJson(jsonLine, Data.class); Translations translations = data.getTranslation(); TranslatedText[] arrayTranslatedText = translations.getArrayTranslatedText(); //this returns an array, based on json string for(TranslatedText translatedText:arrayTranslatedText ) { System.out.println(translatedText.getArrayTranslatedText()); } } } public class Data{ private Translations translations; public Translations getTranslation() { return translations; } public void setTranslation(Translations translations) { this.translations = translations; } } public class Translations { private TranslatedText[] translatedText; public TranslatedText[] getArrayTranslatedText() { return translatedText; } public void setTranslatedText(TranslatedText[] translatedText) { this.translatedText= translatedText; } } public class TranslatedText { private String translatedText; public String getTranslatedText() { return translatedText; } public void setTranslatedText(String translatedText) { this.translatedText = translatedText; } } 

您可以使用单独的类来表示JSON对象,并使用@SerializedName批注指定要为每个数据成员抓取的字段名称:

 public class Response { @SerializedName("data") private Data data; private static class Data { @SerializedName("translations") public Translation[] translations; } private static class Translation { @SerializedName("translatedText") public String translatedText; } public String getTranslatedText() { return data.translations[0].translatedText; } } 

然后你可以使用Gson对象在你的parse()方法中进行解析:

 Gson gson = new Gson(); Response response = gson.fromJson(jsonLine, Response.class); System.out.println("Translated text: " + response.getTranslatedText()); 

使用这种方法,您可以重新使用Response类来添加其他任何附加字段,以便从JSON中提取其他数据成员,以便在一次调用中进行更改(例如,获取多个翻译的结果) ,或者获取检测到的源语言的附加字符串。

  JsonParser parser = new JsonParser(); JsonObject jo = (JsonObject) parser.parse(data); JsonElement je = jo.get("some_array"); //Parsing back the string as Array JsonArray ja = (JsonArray) parser.parse(o.get("some_array").getAsString()); for (JsonElement jo : ja) { JsonObject j = (JsonObject) jo; // Your Code, Access json elements as j.get("some_element") } 

一个简单的例子来解析这样的JSON

{“some_array”:“[\”some_element \“:1,\”some_more_element \“:2]”,“some_other_element”:3}

您可以使用JsonPath查询来提取值。 而由Gson支持的JsonSurfer ,你的问题可以通过简单的两行代码来解决!

  JsonSurfer jsonSurfer = JsonSurfer.gson(); String result = jsonSurfer.collectOne(jsonLine, String.class, "$.data.translations[0].translatedText"); 

首先使用下面的解析网站生成Getter和Setter

http://www.jsonschema2pojo.org/

现在使用Gson

 GettetSetterClass object=new Gson().fromjson(jsonLine,GettetSetterClass.class); 

现在使用object来获取数据,translationText等值

一行代码:

 System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());