使用gsonforjava解析JSON
我想从JSON解析数据,JSON类型为使用gsonforjava解析JSON,java,json,gson,Java,Json,Gson,我想从JSON解析数据,JSON类型为String。 我正在使用 我有: jsonLine = " { "data": { "translations": [ { "translatedText": "Hello world" } ] } } "; 我的班级是: public class JsonParsing{ public void parse(String jsonLine) { // there I would like to ge
String
。
我正在使用
我有:
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").getAsString();
return result;
}
为了使使用更加通用,您会发现这是非常清楚和有用的。使用Gson解决问题。
我将为json字符串中的单个参数创建一个类。或者,您可以创建一个名为“Data”的主类,然后类似地创建内部类。为了清晰起见,我创建了单独的类 课程如下
- 资料
- 翻译
- 翻译文本
代码
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);
下面是一个示例-在我的第一个gson应用程序中,我避免使用其他类来捕获值 主要是因为我使用json进行配置 尽管缺少信息(即使是gson页面),我还是发现并使用了: 从
Map jsonJavaRootObject = new Gson().fromJson("{/*whatever your mega complex object*/}", Map.class)
每次gson看到{}时,它都会创建一个映射(实际上是gson-StringMap)
每次gson看到“”时,它都会创建一个字符串
每次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")
);
Map javaRootMapObject=new Gson().fromJson(jsonLine,Map.class);
System.out.println(
(
(地图)
(
(名单)
(
(地图)
(
获取(“数据”)
)
).get(“翻译”)
).get(0)
).get(“translatedText”)
);
下面是一个解析JSON的简单示例
{
“some\u数组”:“[\“some\u element\”:1、\“some\u more\u element\”:2]”,
“某些其他元素”: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.gson();
String result = jsonSurfer.collectOne(jsonLine, String.class, "$.data.translations[0].translatedText");
首先使用下面的解析站点生成getter和setter 现在使用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());
一种方法是创建一个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();
希望这有帮助。JsonObject扩展了JsonElement,因此两者都是。第一行抛出无法实例化gson-2.2.4.jarString结果=jobject.get(“translatedText”).toString()版本上的JsonParser类型;此结果将包括双引号。字符串结果=jobject.get(“translatedText”).getAsString();不包括引号。我是唯一一个认为Gson在98%的时间里过分复杂的人?一个简单的JSONObject就可以了,但是我们都非常讨厌try/catch?我需要使用parser类,但是,我得到了MalformedJsonException,所以我必须能够使用JsonParser执行SetLeinient。怎么做?这些助手类不需要一些setter吗?没有任何东西可以在不违反访问控制的情况下设置
私有字符串translatedText
,因此fromJSON
无法在没有选择在访问控制上进行反射践踏的JVM中设置它。@Mike Samuel shoot完全忘记了设置器,然后您的对象结构与JSON不匹配。类似:
String fieldValue = jobj.get(fieldName).getAsString();
boolean fieldValue = jobj.get(fieldName).getAsBoolean();
int fieldValue = jobj.get(fieldName).getAsInt();