Gson: String'i JsonObject'e doğrudan dönüştür (POJO yok)


300

Bunu anlayamıyorum. GSON JSON ağaç manipülasyon deniyorum, ama ben bilmiyorum ya da dönüştürmeden önce içine bir dize dönüştürmek için bir POJO bir vaka var JsonObject. Bir doğrudan gitmek için bir yol var mı Stringhiç JsonObject?

Aşağıdaki denedim (Scala sözdizimi):

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

ancak abaşarısız olursa, JSON yalnızca kaçar ve ayrıştırılır JsonStringve bboş bir değer döndürür JsonObject.

Herhangi bir fikir?


1
Gson doğrulama tuzaklarına dikkat edin: stackoverflow.com/questions/43233898/…
Vadzim

Yanıtlar:


525

JsonParser kullanın; Örneğin:

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

17
ugh statik 1 astar kolaylık yöntemi olmalıdır
Blundell

43
JsonObject oyuncu kadrosu gereksiz, daha iyi kullanımnew JsonParser().parse(..).getAsJsonObject();
Chriss

1
Sanırım JsonParser soyut bir sınıf
Jatin Sehgal

1
@KevinMeredith bağlantı koptu, lütfen bunu kullanın
Ninja

4
Bu yöntemin artık kullanımdan kaldırıldığını unutmayın. Kullanın JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig

147

getAsJsonObject()Kabul edilen cevapta kullanılan düz bir döküm yerine kullanmaya çalışın :

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

2
Herhangi bir nedenle membersüst anahtarla sarılır . Örnek bir {"üyeler": {"key1": "13756963814f2c594822982c0307fb81", "key2": true, "key3": 123456789}}
Hossain Khan

1
2.2.4 gibi en son gson kütüphanesini kullanın. 2.2.2 gibi sürüm bazı nedenlerden dolayı üyeler etiketi ekler.
Rubin Yoo

2
JsonParser (). Parse (), Gson'un daha yeni sürümlerinde kullanımdan kaldırılmıştır. Kullanın JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()veya Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
Jimmy Garpehäll

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

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


3
Cevabınızı doğruladım.
Purushotham

@knoxxs, Yani JsonObjectsınıf tanımı mı? Google'ın Gson kütüphanesinden geliyor. Belgelere buradan başvurabilirsiniz .
Purushotham

Bu bana JsonElement no-arg yapıcısı yok şikayetçi bir hata veriyor.
clapas

37

En basit yol, aşağıda gösterildiği gibi JsonPrimitivetüretilmiş sınıfı kullanmaktır JsonElement:

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

2
Bu en basit cevap ve bana yardımcı oldu. Teşekkürler!
khiner

11

Az önce aynı problemle karşılaştı. JsonElementSınıf için önemsiz bir özel serileştirici yazabilirsiniz :

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

Bunun daha kolay bir yaklaşım olduğuna inanıyorum:

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

Ve sonra şöyle diyebilirsiniz:

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

Bu şekilde tüm hazırda bekletme nesneleri otomatik olarak dönüştürülür.


3

JsonParserYapıcı kullanımdan kaldırıldı. Bunun yerine statik yöntemi kullanın:

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

2

Dize bir JSON dizisi (yalnızca 1 nesnenin) sunucuya gönderildiği EXTJS 4.X veri deposunun uzaktan sıralama ile bir senaryo geldi.
Daha önce basit bir dize için sunulana benzer bir yaklaşım, sadece JsonObject önce JsonArray dönüştürmek gerekir.

İstemciden dize: [{"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");

Yukarıda, anahtar / değer verilerinizi gson nesnesine dönüştürmenin en kolay yoludur.
Maddy

1
Teşekkürler, benim durumumda ben başlamak için gereken ayrıştırılmamış bir JSON dizesi vardı.
7zark7
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.