簡體   English   中英

使用GSON反序列化包含JSON的對象

[英]Deserializing an object that contains JSON using GSON

我正在使用gson從JSON表示中反序列化POJO對象。

我希望我的一個POJO中的一個字段包含任意JSON數據。 例如:

class B {
    public String stringField;
    public JsonObject jsonField;
}

我希望能夠在以下JSON上調用Gson.fromJson(json, B.class)

{
    "stringField": "booger",
    "jsonField" :
    {
        "arbitraryField1": "foo"
    }
}

並使得結果B.jsonField包含一個值為fooarbitraryField的JsonObject。

但是,當我嘗試這樣做時, jsonField始終是一個空對象( {} )。 事實上,更一般地說,以下似乎總是返回一個空對象:

new Gson().fromJson("{ foo: 1 }", JsonObject.class)

我希望上面的內容返回一個包含名為foo的值為1的字段的對象。

在將json反序列化為POJOS時,如何讓gson保留任意json數據?

我能夠通過引入一個包含JsonObject的包裝器對象來解決這個問題,然后為該對象編寫一個自定義反序列化器,它只返回原始的json。 但是,似乎必須有更好的方法。

對於后代,反序列化器和普通包裝器對象如下所示:

class MyJsonObjectWrapperDeserializer implements JsonDeserializer<MyJsonObjectWrapper> {
    @Override
    public MyJsonObjectWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return new MyJsonObjectWrapper(json.getAsJsonObject());
    }
}

class MyJsonObjectWrapper {
    public JsonObject json;

    public MyJsonObjectWrapper(JsonObject json) {
        this.json = json;
    }
}

你可以使用JsonParser:

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

考慮一下這個反序列化器,這是我對doc的解釋。

import com.google.gson.*;
import java.lang.reflect.Type;

class B {
    public String stringField;
    public JsonObject jsonField;
}

class BDeserializer implements JsonDeserializer<B> {
    public B deserialize(JsonElement json, Type typeOfT, 
                         JsonDeserializationContext context)
                 throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();

        B b = new B();
        b.stringField = jsonObject.get("stringField").getAsString();
        b.jsonField = jsonObject.getAsJsonObject("jsonField"); 

        return b;
    }
}

public class Test {
    static public void main(String[] args) {
        GsonBuilder gson = new GsonBuilder();
        gson.registerTypeAdapter(B.class, new BDeserializer());

        String json = " { \"stringField\" : \"booger\", \"jsonField\" : { \"arbitraryField1\" : \"foo\" } } ";

        B b = gson.create().fromJson(json, B.class);
        System.out.println(b.stringField);
        System.out.println(b.jsonField.toString());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM