使用gsonforjava解析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

我想从JSON解析数据,JSON类型为
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”的主类,然后类似地创建内部类。为了清晰起见,我创建了单独的类

课程如下

  • 资料
  • 翻译
  • 翻译文本
在类JsonParsing中,我们调用方法“parse”,它将使用反射转换java对象中的字符串

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

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

一些好的例子和文章。

代码

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