使用Gson for Java进行JSON解析


154

我想从类型为的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"

   }

}

Answers:


241

这是执行此操作的简单代码,我避免了所有检查,但这是主要思想。

 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非常清楚并且很有帮助。


1
JsonObject扩展了JsonElement,因此两者都是。
MByD 2011年

第一行抛出不能在版本gson-2.2.4.jar上实例化类型为JsonParser的类型
非法参数

3
字符串结果= jobject.get(“ translatedText”)。toString(); 此结果将包括双引号。字符串结果= jobject.get(“ translatedText”)。getAsString(); 不包括引号。
user1165560

我是唯一一个认为Gson在98%的情况下使事情变得复杂的人吗?一个简单的JSONObject就可以了,但是我们都讨厌这么尝试/抓住吗?
技巧论

我需要使用解析器类,但是,我得到了MalformedJsonException,因此我必须能够使用JsonParser进行SetLeinient。怎么样?
Mason Wang

111

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

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

从...开始

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

每当gson看到{}时,它都会创建一个Map(实际上是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")
    );

20

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

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;

2
然后,您的对象结构与JSON不匹配。
StaxMan

14

您可以为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


8

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


7

一种方法是创建一个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();

希望这可以帮助。


5

使用Gson解决,
我将在json字符串中为单个参数创建一个类。另外,您可以创建一个称为“数据”的主类,然后类似地创建内部类。为了清楚起见,我创建了单独的类。

这些类如下。

  • 数据
  • 翻译
  • 翻译文字

在类JsonParsing中,我们调用方法“ parse”,该方法gson.fromJson(jsonLine, Data.class)将使用Reflection在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;
        }
    }

在这些帮助程序类上,您不需要一些二传手吗?在private String translatedText不违反访问控制的fromJSON前提下,没有什么可以设置的,因此在没有选择反射遍历整个访问控制的JVM中无法设置它。
Mike Samuel

@迈克·塞缪尔(Mike Samuel)拍摄完全忘记了塞特犬-肯森·
约翰

3
    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}


2

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

http://www.jsonschema2pojo.org/

现在使用Gson

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

现在使用object获取值,例如data,translationText


2

您可以使用JsonPath查询来提取值。有了由Gson支持的JsonSurfer,只需两行代码就可以解决您的问题!

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

1

一行代码:

System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.