使用Gson for Java进行JSON解析

Mar*_*nas 146 java json gson

我想解析来自JSON类型的数据String.我正在使用Google Gson.

我有:

jsonLine = "
{
 "data": {
  "translations": [
   {
    "translatedText": "Hello world"
   }
  ]
 }
}
";
Run Code Online (Sandbox Code Playgroud)

我的班级是:

public class JsonParsing{

   public void parse(String jsonLine) {

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

   }

}
Run Code Online (Sandbox Code Playgroud)

MBy*_*ByD 227

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

 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;
}
Run Code Online (Sandbox Code Playgroud)

为了使用更通用 - 您会发现Gson的javadoc非常清晰且有用.

  • String result = jobject.get("translatedText").toString(); 此结果将包括双引号.String result = jobject.get("translatedText").getAsString(); 不包括引号. (3认同)

Jor*_*hez 106

在我的第一个gson应用程序中,我避免使用其他类来捕获值,主要是因为我使用json来配置事务

尽管缺乏信息(甚至是gson页面),这就是我发现和使用的:

从...开始

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

每次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")
    );
Run Code Online (Sandbox Code Playgroud)


Sta*_*Man 19

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

public class Wrapper {
   public Data data;
}
static class Data {
   public Translation[] translations;
}
static class Translation {
   public String translatedText;
}
Run Code Online (Sandbox Code Playgroud)

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

所以类似于:

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

  • 然后,您的对象结构与JSON不匹配。 (2认同)

Har*_*eet 14

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

Gson gson = new GsonBuilder().create(); 
Response r = gson.fromJson(jsonString, Response.class);
Run Code Online (Sandbox Code Playgroud)

这是一个例子 - http://rowsandcolumns.blogspot.com/2013/02/url-encode-http-get-solr-request-and.html

  • 谢谢:GsonBuilder().create(); (3认同)

Ana*_*uli 9

一种方法是创建一个 JsonObject 并遍历参数。例如

JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class);
Run Code Online (Sandbox Code Playgroud)

然后你可以提取 bean 值,如:

String fieldValue = jobj.get(fieldName).getAsString();
boolean fieldValue = jobj.get(fieldName).getAsBoolean();
int fieldValue = jobj.get(fieldName).getAsInt();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


rmt*_*eis 7

您可以使用单独的类来表示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;
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Gson gson = new Gson();
Response response = gson.fromJson(jsonLine, Response.class);

System.out.println("Translated text: " + response.getTranslatedText());
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您可以重用Response该类来添加任何其他附加字段,以获取您可能希望从JSON中提取的其他数据成员 - 如果您想要进行更改以获取结果,例如,在一次调用中进行多次翻译,或获取检测到的源语言的附加字符串.


ken*_*ohn 5

使用Gson解决
我将在json String中为单个参数创建一个类.或者,您可以创建一个名为"Data"的主类,然后类似地创建内部类.为清晰起见,我创建了单独的类

课程如下.

  • 数据
  • 翻译
  • TranslatedText

在类JsonParsing中,方法"解析"我们调用gson.fromJson(jsonLine, Data.class)哪个将使用Reflection转换java对象中的String.

一旦我们可以访问"Data"对象,我们就可以单独访问每个参数.

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

一些很好的例子和文章.
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;
        }
    }
Run Code Online (Sandbox Code Playgroud)


Rah*_*tra 5

    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")
    }
Run Code Online (Sandbox Code Playgroud)

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

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