Gson: Chuyển đổi trực tiếp Chuỗi thành JsonObject (không có POJO)


300

Dường như không thể tìm ra điều này. Tôi đang thử thao tác cây JSON trong GSON, nhưng tôi gặp trường hợp tôi không biết hoặc có POJO để chuyển đổi chuỗi thành, trước khi chuyển đổi sang JsonObject. Có cách nào để đi trực tiếp từ a Stringđến JsonObject?

Tôi đã thử cách sau (cú pháp 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])

nhưng akhông thành công, JSON được thoát và phân tích cú pháp JsonStringduy nhất và btrả về một sản phẩm nào JsonObject.

Có ý kiến ​​gì không?


1
Cảnh giác với những cạm bẫy xác thực của gson: stackoverflow.com/questions/43233898/iêng
Vadzim 19/12/17

Câu trả lời:


525

sử dụng JsonParser; ví dụ:

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

17
ugh nên có một phương pháp tiện lợi lót 1 tĩnh
Blundell

43
việc chuyển sang JsonObject là không cần thiết, sử dụng tốt hơnnew JsonParser().parse(..).getAsJsonObject();
Chriss

1
Tôi đoán JsonParser là một lớp trừu tượng
Jatin Sehgal

1
@KevinMeredith liên kết của bạn bị hỏng, vui lòng sử dụng cái này
Ninja

4
Lưu ý rằng phương pháp này hiện không được chấp nhận. Sử dụng JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig

147

Cố gắng sử dụng getAsJsonObject()thay vì một diễn viên thẳng được sử dụng trong câu trả lời được chấp nhận:

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

2
Đối với một số lý do, nó kết thúc tốt đẹp với memberskhóa cha. Đây là một mẫu {"thành viên": {"key1": "13756963814f2c594822982c0307fb81", "key2": true, "key3": 123456789}}
Hossain Khan

1
Sử dụng thư viện gson mới nhất, như 2.2.4. Phiên bản như 2.2.2 thêm thẻ thành viên vì một số lý do.
Rubin Yoo

2
JsonParser (). Parse () không được dùng trong các phiên bản mới hơn của Gson. Sử dụng JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()hoặc 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();

bạn có thể xác thực câu trả lời của tôi bằng cách GSON để chuyển đổi dữ liệu Danh sách sang jsonobject bằng gson stackoverflow.com/questions/18442452/
Kẻ

3
Tôi đã xác nhận câu trả lời của bạn.
Purushotham

@knoxxs, Ý bạn là JsonObjectđịnh nghĩa lớp? Nó đến từ thư viện Gson của Google. Bạn có thể tham khảo tài liệu ở đây .
Purushotham

Điều này cho tôi một lỗi phàn nàn về việc JsonEuity không có hàm tạo không có đối số.
clapas

37

Cách đơn giản nhất là sử dụng JsonPrimitivelớp, xuất phát từ JsonElement, như hiển thị bên dưới:

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

2
Đây là câu trả lời đơn giản nhất và giúp tôi ra ngoài. Cảm ơn!
khiner

11

Chỉ gặp phải vấn đề tương tự. Bạn có thể viết một trình giải nén tùy chỉnh tầm thường cho JsonElementlớp:

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

Tôi tin rằng đây là một cách tiếp cận dễ dàng hơn:

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

Và sau đó bạn sẽ có thể gọi nó như thế này:

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

Bằng cách này, tất cả các đối tượng ngủ đông sẽ được chuyển đổi tự động.


3

Các nhà JsonParserxây dựng đã được phản đối. Sử dụng phương thức tĩnh thay thế:

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

2

Chuyển qua một kịch bản với việc sắp xếp lưu trữ dữ liệu từ xa trong EXTJS 4.X trong đó chuỗi được gửi đến máy chủ dưới dạng một mảng JSON (chỉ có 1 đối tượng).
Cách tiếp cận tương tự với những gì được trình bày trước đây cho một chuỗi đơn giản, chỉ cần chuyển đổi sang JsonArray trước khi đến JsonObject.

Chuỗi từ máy khách: [{"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");

Trên đây là cách dễ nhất để chuyển đổi dữ liệu khóa-giá trị của bạn sang đối tượng gson.
Maddy

1
Cảm ơn, trong trường hợp của tôi, tôi đã có một chuỗi JSON chưa được chỉnh sửa mà tôi cần bắt đầu từ đó.
7zark7 04/07/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.