Programing

Gson for Java를 사용한 JSON 구문 분석

crosscheck 2020. 6. 14. 10:33
반응형

Gson for Java를 사용한 JSON 구문 분석


유형의 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"

   }

}

이것은 간단한 코드이므로 모든 검사를 피했지만 이것이 주요 아이디어입니다.

 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의 javadoc 이 매우 명확하고 유용 하다는 것을 알 수 있습니다.


첫 번째 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")
    );

가장 간단한 것은 일반적으로 다음과 같이 일치하는 객체 계층을 만드는 것입니다.

public class Wrapper {
   public Data data;
}
static class Data {
   public Translation[] translations;
}
static class Translation {
   public String translatedText;
}

그런 다음 GSON을 사용하여 바인딩하고 필드를 통해 객체 계층을 통과합니다. 기본 데이터 컨테이너에는 게터 및 세터 추가가 의미가 없습니다.

그래서 같은 :

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


별도의 클래스를 사용하여 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());

With this approach, you can reuse the Response class to add any other additional fields to pick up other data members you might want to extract from JSON -- in case you want to make changes to get results for, say, multiple translations in one call, or to get an additional string for the detected source language.


Using Gson to Solve
I would create a class for individual parameter in the json String. Alternatively you can create one main class called "Data" and then create inner classes similarly. I created separate classes for clarity.

The classes are as follows.

  • Data
  • Translations
  • TranslatedText

In the class JsonParsing the method "parse" we call gson.fromJson(jsonLine, Data.class) which will convert the String in java objects using Reflection.

Once we have access to the "Data" object we can access each parameter individually.

Didn't get a chance to test this code as I am away from my dev machine. But this should help.

Some good examples and articles.
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide

Code

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

One way would be created a JsonObject and iterating through the parameters. For example

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

Then you can extract bean values like:

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

Hope this helps.


    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")
    }

A simple example to parse a JSON like this

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


Firstly Generate Getter And Setter using below parsing site

http://www.jsonschema2pojo.org/

Now use Gson

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

Now use object to get values such as data,translationText


You can use a JsonPath query to extract the value. And with JsonSurfer which is backed by Gson, your problem can be solved by simply two line of code!

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

One line code:

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

참고URL : https://stackoverflow.com/questions/5490789/json-parsing-using-gson-for-java

반응형