Gson : String을 JsonObject로 직접 변환 (POJO 없음)


300

이것을 알아낼 수 없습니다. GSON에서 JSON 트리 조작을 시도하고 있지만로 변환하기 전에 문자열을 변환 할 POJO를 모르거나 가지고있는 경우가 JsonObject있습니다. 에서 직접 갈 수있는 방법 StringJsonObject있습니까?

다음을 시도했습니다 (Scala 구문).

val gson = (new GsonBuilder).create

val a: JsonObject = gson.toJsonTree("""{ "a": "A", "b": true }""").getAsJsonObject
val b: JsonObject = gson.fromJson("""{ "a": "A", "b": true }""", classOf[JsonObject])

하지만 a의 JSON 탈출과 같은 구문 분석 실패 JsonString만하고 b빈을 반환합니다 JsonObject.

어떤 아이디어?


1
GSON 검증 함정주의 : stackoverflow.com/questions/43233898/...
바드

답변:


525

JsonParser를 사용하십시오. 예를 들면 다음과 같습니다.

JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();

17
ugh는 정적 1 라이너 편의 방법을 가져야합니다
Blundell

43
JsonObject 로의 캐스트는 불필요하고 더 잘 사용됩니다new JsonParser().parse(..).getAsJsonObject();
Chriss

1
나는 JsonParser는 추상 클래스 추측
Jatin Sehgal

1
당신이 깨진 링크 @KevinMeredith 사용 하십시오
닌자

4
이 방법은 더 이상 사용되지 않습니다. 사용하십시오 JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig

147

getAsJsonObject()허용 된 답변에 사용 된 직선 형 대신에 사용하십시오 .

JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();

2
어떤 이유로 members부모 키로 래핑됩니다 . 다음은 샘플 { "members"입니다. { "key1": "13756963814f2c594822982c0307fb81", "key2": true, "key3": 123456789}}
Hossain Khan

1
2.2.4와 같은 최신 gson 라이브러리를 사용하십시오. 2.2.2와 같은 버전은 어떤 이유로 회원 태그를 추가합니다.
Rubin Yoo

2
JsonParser (). parse ()는 최신 버전의 Gson에서 더 이상 사용되지 않습니다. 사용 JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()또는 Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
지미 Garpehäll

54
String jsonStr = "{\"a\": \"A\"}";

Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();


3
귀하의 답변을 확인했습니다.
Purushotham

@ knoxxs, JsonObject클래스 정의를 의미 합니까? Google의 Gson 라이브러리에서 가져옵니다. 여기 에서 설명서를 참조 할 수 있습니다 .
Purushotham

이것은 인수없는 생성자가없는 JsonElement에 대해 불평하는 오류를 제공합니다.
clapas

37

가장 간단한 방법은 다음과 같이 JsonPrimitive클래스 를 사용 하는 것입니다 JsonElement.

JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();

2
이것은 가장 간단한 답변이며 도움이되었습니다. 감사!
khiner

11

같은 문제가 발생했습니다. JsonElement클래스에 대한 간단한 사용자 정의 디시리얼라이저를 작성할 수 있습니다 .

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

GsonBuilder gson_builder = new GsonBuilder();
gson_builder.registerTypeAdapter(
        JsonElement.class,
        new JsonDeserializer<JsonElement>() {
            @Override
            public JsonElement deserialize(JsonElement arg0,
                    Type arg1,
                    JsonDeserializationContext arg2)
                    throws JsonParseException {

                return arg0;
            }
        } );
String str = "{ \"a\": \"A\", \"b\": true }";
Gson gson = gson_builder.create();
JsonElement element = gson.fromJson(str, JsonElement.class);
JsonObject object = element.getAsJsonObject();

4

나는 이것이 더 쉬운 접근법이라고 믿습니다.

public class HibernateProxyTypeAdapter implements JsonSerializer<HibernateProxy>{

    public JsonElement serialize(HibernateProxy object_,
        Type type_,
        JsonSerializationContext context_) {
        return new GsonBuilder().create().toJsonTree(initializeAndUnproxy(object_)).getAsJsonObject();
        // that will convert enum object to its ordinal value and convert it to json element

    }

    public static <T> T initializeAndUnproxy(T entity) {
        if (entity == null) {
            throw new 
               NullPointerException("Entity passed for initialization is null");
        }

        Hibernate.initialize(entity);
        if (entity instanceof HibernateProxy) {
            entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer()
                    .getImplementation();
        }
        return entity;
    }
}

그러면 다음과 같이 호출 할 수 있습니다.

Gson gson = new GsonBuilder()
        .registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxyTypeAdapter())
        .create();

이렇게하면 모든 최대 절전 모드 개체가 자동으로 변환됩니다.


3

JsonParser생성자는 사용되지 않습니다. 대신 정적 메소드를 사용하십시오.

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();

2

EXTJS 4.X에서 원격으로 데이터 저장소를 정렬하는 시나리오에서 문자열이 JSON 배열 (1 개의 오브젝트 만)로 서버에 전송됩니다.
간단한 문자열에 대해 이전에 제시된 것과 비슷한 접근 방식이므로 JsonObject보다 먼저 JsonArray로 변환하면됩니다.

클라이언트의 문자열 : [{ "property": "COLUMN_NAME", "direction": "ASC"}]

String jsonIn = "[{\"property\":\"COLUMN_NAME\",\"direction\":\"ASC\"}]";
JsonArray o = (JsonArray)new JsonParser().parse(jsonIn);

String sortColumn = o.get(0).getAsJsonObject().get("property").getAsString());
String sortDirection = o.get(0).getAsJsonObject().get("direction").getAsString());

1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");

위는 키-값 데이터를 gson 객체로 변환하는 가장 쉬운 방법입니다.
Maddy

1
고마워, 내 경우에는 파싱되지 않은 JSON 문자열이있어서 시작해야했습니다.
7zark7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.