programing

Gson: 문자열을 Json Object로 직접 변환(POJO 없음)

copysource 2022. 8. 10. 21:18
반응형

Gson: 문자열을 Json Object로 직접 변환(POJO 없음)

이해할 수 없을 것 같아.GSON에서 JSON 트리 조작을 시도하고 있는데 변환하기 전에 문자열을 변환하는 POJO를 모르거나 변환해야 하는 경우가 있습니다.JsonObject에서 직접 가는 방법이 있나요?String로.JsonObject?

다음 (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.

좋은 생각 있어요?

예를 들어 JsonParser를 사용합니다.

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

사용해보십시오.getAsJsonObject()인정된 답변에 사용된 스트레이트 캐스트 대신:

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

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

가장 간단한 방법은,JsonPrimitive에서 유래한 클래스JsonElement다음과 같이 합니다.

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

방금 같은 문제가 발생했습니다.에 대한 간단한 커스텀 디시리얼라이저를 작성할 수 있습니다.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();

JsonParser생성자가 더 이상 사용되지 않습니다.대신 static 방식을 사용합니다.

JsonObject asJsonObject = JsonParser.parseString(someString).getAsJsonObject();

저는 이것이 더 쉬운 접근법이라고 생각합니다.

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

이렇게 하면 모든 휴지 상태 개체가 자동으로 변환됩니다.

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());
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");

com.google.gson.JsonParser#parse(java.lang.String)폐지되었습니다.

그러니까 쓰세요com.google.gson.JsonParser#parseString, 꽤 잘 작동합니다.

Kotlin의 예:

val mJsonObject = JsonParser.parseString(myStringJsonbject).asJsonObject

Java의 예:

JsonObject mJsonObject = JsonParser.parseString(myStringJsonbject).getAsJsonObject();

언급URL : https://stackoverflow.com/questions/4110664/gson-directly-convert-string-to-jsonobject-no-pojo

반응형