Gson: Langsung mengonversi String ke JsonObject (tidak ada POJO)


300

Sepertinya tidak bisa memahaminya. Saya mencoba manipulasi pohon JSON di GSON, tetapi saya memiliki kasus di mana saya tidak tahu atau memiliki POJO untuk mengubah string menjadi, sebelum mengkonversi JsonObject. Apakah ada cara untuk langsung dari satu Stringke yang lain JsonObject?

Saya sudah mencoba yang berikut (sintaks 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])

tetapi agagal, JSON melarikan diri dan diuraikan sebagai satu- JsonStringsatunya, dan bmengembalikan yang kosong JsonObject.

Ada ide?


1
Waspadalah terhadap perangkap validasi gson: stackoverflow.com/questions/43233898/...
Vadzim

Jawaban:


525

gunakan JsonParser; sebagai contoh:

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

17
ugh harus memiliki metode kenyamanan 1 liner statis
Blundell

43
para pemeran untuk JsonObject tidak perlu, gunakan lebih baiknew JsonParser().parse(..).getAsJsonObject();
Chriss

1
Saya kira JsonParser adalah kelas abstrak
Jatin Sehgal

1
@KevinMeredith tautan Anda rusak, silakan gunakan ini
Ninja

4
Perhatikan bahwa metode ini sekarang sudah tidak digunakan lagi. Gunakan JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig

147

Cobalah untuk menggunakan getAsJsonObject()alih-alih gips lurus yang digunakan dalam jawaban yang diterima:

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

2
Untuk beberapa alasan itu dibungkus dengan memberskunci induk. Berikut adalah contoh {"anggota": {"key1": "13756963814f2c594822982c0307fb81", "key2": true, "key3": 123456789}}
Hossain Khan

1
Gunakan pustaka gson terbaru, seperti 2.2.4. Versi seperti 2.2.2 menambahkan tag anggota untuk beberapa alasan.
Rubin Yoo

2
JsonParser (). Parse () tidak digunakan lagi dalam versi Gson yang lebih baru. Gunakan JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()atau 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();

dapatkah Anda memvalidasi jawaban saya dengan cara GSON untuk mengonversi data Daftar ke jsonobject oleh gson stackoverflow.com/questions/18442452/…
LOG_TAG

3
Saya telah memvalidasi jawaban Anda.
Purushotham

@knoxxs, maksud Anda JsonObjectdefinisi kelas? Itu berasal dari perpustakaan Google Gson. Anda dapat merujuk dokumentasi di sini .
Purushotham

Ini memberi saya kesalahan mengeluh tentang JsonElement tidak memiliki konstruktor no-arg.
clapas

37

Cara paling sederhana adalah dengan menggunakan JsonPrimitivekelas, yang berasal dari JsonElement, seperti yang ditunjukkan di bawah ini:

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

2
Ini adalah jawaban paling sederhana dan membantu saya. Terima kasih!
khiner

11

Baru saja menemui masalah yang sama. Anda dapat menulis deserializer khusus sepele untuk JsonElementkelas:

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

Saya percaya ini adalah pendekatan yang lebih mudah:

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

Dan Anda akan dapat menyebutnya seperti ini:

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

Dengan cara ini semua objek hibernasi akan dikonversi secara otomatis.


3

The JsonParserkonstruktor telah usang. Gunakan metode statis sebagai gantinya:

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

2

Datang di skenario dengan penyortiran jauh menyimpan data di EXTJS 4.X di mana string dikirim ke server sebagai array JSON (hanya 1 objek).
Pendekatan serupa dengan apa yang disajikan sebelumnya untuk string sederhana, hanya perlu konversi ke JsonArray terlebih dahulu sebelum JsonObject.

String dari klien: [{"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");

Di atas adalah cara termudah untuk mengonversi data nilai kunci ke objek gson.
Maddy

1
Terima kasih, dalam kasus saya, saya memiliki string JSON yang tidak diparsing yang harus saya mulai.
7zark7
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.