Gson: แปลงสตริงเป็น JsonObject โดยตรง (ไม่มี POJO)


300

ดูเหมือนจะไม่สามารถเข้าใจได้ ฉันพยายาม JSON จัดการต้นไม้ใน GSON แต่ฉันมีกรณีที่ผมไม่ทราบหรือมี POJO JsonObjectการแปลงสายอักขระลงก่อนที่จะแปลงไป มีวิธีที่จะไปจาก a 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เท่านั้นและ ผลตอบแทนที่ว่างเปล่าbJsonObject

ความคิดใด ๆ


1
ระวังข้อผิดพลาดในการตรวจสอบความถูกต้องของ gson: stackoverflow.com/questions/43233898/…
Vadzim

คำตอบ:


525

ใช้ JsonParser ตัวอย่างเช่น:

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

17
ควรมีวิธีอำนวยความสะดวกแบบคงที่ 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คีย์ผู้ปกครอง นี่คือตัวอย่าง {"สมาชิก": {"key1": "13756963814f2c594822982c0307fb81", "key2": จริง, "key3": 123456789}}
Hossain Khan

1
ใช้ไลบรารี gson ล่าสุดเช่น 2.2.4 เวอร์ชันเช่น 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();
Jimmy Garpehäll

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

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

คุณสามารถตรวจสอบคำตอบของฉันด้วยวิธี GSON สำหรับการแปลงข้อมูลรายการเป็น jsonobject โดย gson stackoverflow.com/questions/18442452/…
LOG_TAG

3
ฉันตรวจสอบคำตอบของคุณแล้ว
Purushotham

@knoxxs, คุณหมายถึงJsonObjectคำจำกัดความของชั้นเรียน? มันมาจากห้องสมุด Gson ของ Google คุณสามารถดูเอกสารที่นี่
Purushotham

สิ่งนี้ทำให้ฉันมีข้อผิดพลาดบ่นเกี่ยวกับ JsonElement ไม่ได้มีคอนสตรัคเตอร์ที่ไม่มีข้อโต้แย้ง
clapas

37

วิธีที่ง่ายที่สุดคือการใช้JsonPrimitiveคลาสซึ่งมาจากJsonElementที่แสดงด้านล่าง:

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

2
นี่เป็นคำตอบที่ง่ายที่สุดและช่วยฉันออกไป ขอบคุณ!
khiner

11

เพิ่งพบปัญหาเดียวกัน คุณสามารถเขียน deserializer แบบกำหนดเองเล็กน้อยสำหรับ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();

วิธีนี้วัตถุไฮเบอร์เนตทั้งหมดจะถูกแปลงโดยอัตโนมัติ



2

ข้ามสถานการณ์จำลองด้วยการเรียงลำดับระยะไกลของแหล่งเก็บข้อมูลใน EXTJS 4.X โดยที่สตริงถูกส่งไปยังเซิร์ฟเวอร์เป็นอาร์เรย์ JSON (ของวัตถุเพียง 1 ตัว)
วิธีการที่คล้ายกับสิ่งที่นำเสนอก่อนหน้านี้สำหรับสตริงที่เรียบง่ายเพียงแค่ต้องแปลงเป็น JsonArray ก่อนที่จะ JsonObject

สตริงจากลูกค้า: [{"คุณสมบัติ": "COLUMN_NAME", "ทิศทาง": "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.