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?

7zark7
sumber
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();
Dallan Quass
sumber
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();
Maverick
sumber
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();
Purushotham
sumber
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();
Jozef Benikovský
sumber
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();
Dan Menes
sumber
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.

Eduardo Chico
sumber
3

The JsonParserkonstruktor telah usang. Gunakan metode statis sebagai gantinya:

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();
Stephen Paul
sumber
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());
c2willi
sumber
1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
Maddy
sumber
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