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"

   }

}

답변:


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


1
JsonObject는 JsonElement를 확장하므로 둘 다입니다.
MByD

첫 번째 줄은 발생 할 수 없습니다 인스턴스화 버전 GSON-2.2.4.jar에 유형 JsonParser의
불법 인수

3
문자열 결과 = jobject.get ( "translatedText"). toString (); 이 결과에는 큰 따옴표가 포함됩니다. 문자열 결과 = jobject.get ( "translatedText"). getAsString (); 따옴표는 포함하지 않습니다.
user1165560

나는 Gson이 시간의 98 %를 지나치게 복잡하게 생각하는 유일한 사람입니까? 간단한 JSONObject는 할 것입니다. 그러나 우리 모두 그렇게 많은 시도 / 잡기를 싫어합니까?
tricknology

파서 클래스를 사용해야하지만 MalformedJsonException이 발생하므로 JsonParser로 SetLeinient를 수행 할 수 있어야합니다. 어떻게?
메이슨 왕

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을 사용하여 바인딩하고 필드를 통해 객체 계층을 통과합니다. 기본 데이터 컨테이너에는 게터 및 세터 추가가 의미가 없습니다.

그래서 같은 :

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

2
그런 다음 객체 구조가 JSON과 일치하지 않습니다.
StaxMan


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 String에서 개별 매개 변수에 대한 클래스를 만들 것입니다. 또는 "Data"라는 하나의 기본 클래스를 만든 다음 내부 클래스를 비슷하게 만들 수 있습니다. 명확성을 위해 별도의 클래스를 만들었습니다.

수업은 다음과 같습니다.

  • 데이터
  • 번역
  • TranslatedText

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

@ 마이크 사무엘은 세터에 대해 완전히 잊어 버렸습니다
kensen john

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

이제 객체를 사용하여 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());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.