programing

Java에서 JSONObject 쿼리

procenter 2023. 3. 16. 23:46
반응형

Java에서 JSONObject 쿼리

JSONObject를 조회할 수 있는 Java 라이브러리가 어딘가에 있는지 궁금합니다.자세한 내용은 다음과 같습니다.

String json = "{ data: { data2 : { value : 'hello'}}}";

...
// Somehow we managed to convert json to jsonObject
...

String result = jsonObject.getAsString("data.data2.value");

System.out.println(result);

출력으로 "hello"가 나오길 기대합니다.

지금까지 알아낸 가장 빠른 방법은 Gson을 사용하는 것입니다.

jsonObject.getAsJsonObject("data").getAsJsonObject().get("data2").getAsJsonObject("value").getAsString();

실제로 쓰고 읽는 것은 쉽지 않다.더 빠른 건 없나요?

JSON Path라는 아주 흥미로운 프로젝트를 발견했습니다.

JsonPath는 JSON에게 XPATH와 XML을 의미하며, 주어진 문서의 일부를 추출하는 간단한 방법입니다.

이 라이브러리를 사용하면 원하는 작업을 훨씬 쉽게 수행할 수 있습니다. 그러면 이전 제안 사항:

String hello = JsonPath.read(json, "$.data.data2.value");

System.out.println(hello); //prints hello

이것도 도움이 되길 바랍니다.

Jackson은 완전히 동일하지는 않지만 Gson과 유사한 Tree Model을 가지고 있습니다.

JsonNode root = objectMapper.readTree(jsonInput);
return root.get("data").get("data2").get("value").asText();

차근차근 넘어가야 돼요.

편집 (2015년 8월)

Jackson과의 JSON Pointer 표현은 실제로 지원되고 있습니다(Jackson과의 JSON Pointer 표현은 현재 지원되고 있습니다.그 대신에, 다음과 같은 것을 사용할 수 있습니다.

return root.at("/data/data2/value").asText();

우선 JSON 오브젝트 바인딩을 검토하는 것을 추천합니다.

다만, 임의의 JSON 오브젝트를 입수해, 설명대로 처리하고 싶은 경우는, Jackson JSON 프로세서와 Apache의 Commons Beanutils조합하는 것을 추천합니다.

아이디어는 다음과 같습니다. Jackson은 기본적으로 모든 JSON을 다음과 같이 처리합니다.java.util.Map한편 Commons Beanutils는 어레이 및 Map 지원을 포함한 객체의 속성 액세스를 단순화합니다.

다음과 같이 사용할 수 있습니다.

//actually it is a Map instance with maps-fields within
Object jsonObj = objectMapper.readValue(json, Object.class);

Object hello = PropertyUtils.getProperty(jsonObj, "data.data2.value")

System.out.println(hello); //prints hello

org.json을 사용할 수 있습니다.

    String json = "{ data: { data2 : { value : 'hello'}}}";
    org.json.JSONObject obj = new org.json.JSONObject(json);
    System.out.println(obj.query("/data/data2/value"));

말도 안 될 것 같아.

Java 클래스를 고려하다

class Student {
    Subject subject = new Subject();
}

class Subject {
    String name;
}

여기서 서브젝트명에 액세스 하고 싶은 경우는,

Student stud = new Student();
stud.subject.name; 

이름에 직접 액세스할 수 없습니다. 직접 액세스할 경우 올바른 제목 이름을 얻을 수 없습니다.다음과 같은 경우:

jsonObject.getAsJsonObject("data")
          .getAsJsonObject()
          .get("data2")
          .getAsJsonObject("value")
          .getAsString();

java 오브젝트와 같은 것을 사용하고 싶은 경우는,

ClassName classObject = new Gson().fromJson(JsonString, ClassName.class);

ClassName에는 jsonstring과 일치하는 모든 필드가 있어야 합니다.json 객체에 json 객체가 있는 경우 Student 및 Subject 클래스에서와 같이 별도의 클래스를 만들어야 합니다.

Java JSON API 1.1.x(javax.json)를 사용하면 새로운 기능을 사용할 수 있습니다.JavaPointer인터페이스입니다.이 인터페이스를 실장하는 인스턴스는 XPath 표현 아날로그의 일종이라고 생각할 수 있습니다(자세한 내용은 RFC-6901 참조).이 경우 다음과 같이 쓸 수 있습니다.

import javax.json.*;
//...
var jp = Json.createPointer("/data/data2/value");
System.out.println(jp.getValue(jsonObject));

1.1.4 버전의 JSON에는, 다음의 기능이 추가되어 있습니다.JsonStructure에 )JsonObject ★★★★★★★★★★★★★★★★★」JsonArray즉, »getValue(String jsonPointer)을 사용하다

System.out.println(jsonObject.getValue("/data/data2/value"));

언급URL : https://stackoverflow.com/questions/15429775/query-a-jsonobject-in-java

반응형