使用 GsonforJava 解析 JSON

我想解析来自类型为 String的 JSON 的数据。 我正在使用 谷歌 Gson

我有:

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

我的班级是:

public class JsonParsing{


public void parse(String jsonLine) {


// there I would like to get String "Hello world"


}


}
392305 次浏览

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

 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").getAsString();
return result;
}

为了使用更一般-你会发现 Gson 的 javadocs是相当清楚和有用的。

用 Gson 来解决
我将为 json String 中的单个参数创建一个类。或者,您可以创建一个名为“ Data”的主类,然后类似地创建内部类。为了清楚起见,我创建了单独的类。

课程如下。

  • 百科
  • 翻译
  • 翻译文本

在类 JsonParsing 的方法“ parse”中,我们调用 gson.fromJson(jsonLine, Data.class),它将使用反射在 Java 对象中转换 String。

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

没有机会测试这段代码,因为我离开了我的开发机器。

一些好的例子和文章。
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;
}
}

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

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 配置事项

尽管缺乏信息(甚至是 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")
);
    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 }

您可以使用一个单独的类来表示 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 中提取的其他数据成员——以防您希望进行更改以获得结果,比如一次调用中的多个翻译,或者为检测到的源语言获取额外的字符串。

您可以使用 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 来获取诸如 data、 tranationText 之类的值

一行代码:

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

一种方法是创建一个 JsonObject 并循环访问参数

JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class);

然后您可以提取 bean 值,比如:

String fieldValue = jobj.get(fieldName).getAsString();
boolean fieldValue = jobj.get(fieldName).getAsBoolean();
int fieldValue = jobj.get(fieldName).getAsInt();

希望这个能帮上忙。