簡體   English   中英

使用Gson反序列化Map <String,Object>字段

[英]Deserializing a Map<String, Object> field with Gson

我有一個具有這種結構的User對象:

class User {
    private String id;
    private String name;
    private Map<String, Object> properties;

    // GETTERS & SETTERS
}

我有一個具有這種結構的JSON字符串:

{
    "user": {
        "id:"123456789",
        "name:"azerty",
        "emailHash":"123456789", // not used in User class
        "properties": {
            "p1":1,
            "p2":"test",
            "p3":[1, 2, 3, 4],
            "p4":{
               etc...
            }
        }
    }
}

屬性的鍵是String,屬性的值可以是String,int,Array,boolean,Map等。

我嘗試用Gson反序列化這個JSON字符串:

JsonParser parser = new JsonParser();
JsonElement element = parser.parse(jsonString);
JsonObject object = element.getAsJsonObject();

GsonBuilder builder = new GsonBuilder();
builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = builder.create();
User user = (User) gson.fromJson(object.get("user"), new TypeToken<User>() {}.getType());

字段'id'和'name'被正確注入,但字段'properties'保持為null。

你知道我做錯了什么嗎? 在此先感謝您的幫助!

對我來說這段代碼:

public class Main {
    public static void main(String[] args) throws IOException {
    GsonBuilder builder = new GsonBuilder();
    builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
    Gson gson = builder.create();
    FileInputStream inputStream = new FileInputStream(new File("bobi.json"));
    InputStreamReader reader = new InputStreamReader(inputStream);
    User user = gson.fromJson(reader, User.class);
    System.out.println(user.getName());
    System.out.println(user.getId());
    for (String property : user.getProperties().keySet()) {
        System.out.println("Key: " + property + " value: " + user.getProperties().get(property));
    }
    reader.close();
}

打印這個:

azerty
123456789
Key: p1 value: 1.0
Key: p2 value: test
Key: p3 value: [1.0, 2.0, 3.0, 4.0]
Key: p4 value: {}

但是,請記住,我已經解析了我解析的文件中的包裝json對象。 該文件是:

{
        "id":"123456789",
        "name" : "azerty",
        "emailHash":"123456789", 
        "properties": {
            "p1":1,
            "p2":"test",
            "p3":[1, 2, 3, 4],
            "p4":{

            }
        }
}

另外,我添加了關於nameid結束雙引號,你在樣本中沒有。

OP請求的User類。 我為打印原因添加了getter和setter:

import java.util.Map;

class User {
    private String id;
    private String name;
    private Map<String, Object> properties;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Map<String, Object> getProperties() {
        return properties;
    }
    public void setProperties(Map<String, Object> properties) {
        this.properties = properties;
    }
}

錯誤的反序列化列表<object>與 gson<div id="text_translate"><p> 我用List&lt;Object&gt;調試CUSTOMER object:</p><p> <a href="https://i.stack.imgur.com/Gh2Mx.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Gh2Mx.png" alt="在此處輸入圖像描述"></a></p><p> 這是 CUSTOMER.class:</p><pre> public class CUSTOMER { @XmlElements({ @XmlElement(name = "ADDRESS", type = ADDRESS.class), @XmlElement(name = "ZIP", type = ZIP.class), @XmlElement(name = "CITY", type = CITY.class), @XmlElement(name = "COUNTRY", type = COUNTRY.class), }) protected List&lt;Object&gt; addressAndZIPAndCITY; // other fields }</pre><p> 但是當我反序列化並從中創建 json 時,它僅包含:</p><pre> { "addressAndZIPAndCITY": [ { "value": "some value", "type": "some type" }, { "value": "some value 2", "type": "some type 2" }] }</pre><p> 缺少 ADRESS、ZIP、CITY 和 COUNTRY 對象標題。 所以反序列化不好。</p><p> 我無法更改List&lt;Object&gt;聲明。 是否可以選擇將其反序列化為帶有 ADRESS、ZIP、CITY 等的 json? 像這樣:</p><pre> { "addressAndZIPAndCITY": [{ "ADDRESS": { "value": "some value", "type": "some type" } }, { "ZIP": { "value": "some value 2", "type": "some type 2" } } ] }</pre><p> 編輯:我的意思是它看起來像 GSON 不知道哪個 object 在那里,但可能你知道如何向 model 添加一些注釋或其他東西來識別它?</p></div></object>

[英]Wrong deserializing List<Object> with gson

暫無
暫無

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

相關問題 使用GSON將JSON對象反序列化為字符串字段 反序列化地圖 <Object, Object> 與GSon 使用 Gson 反序列化映射鍵需要一個對象 gson 將字段反序列化為 null 格森地圖 <String, Any> 反對 使用Gson反序列化對象時,字段異常的值無效 Gson通過改變字段類型進行反序列化 Gson 讀數無法解析 object Map 字段 Java:將JSON結構反序列化為Map <String, Object> 錯誤的反序列化列表<object>與 gson<div id="text_translate"><p> 我用List&lt;Object&gt;調試CUSTOMER object:</p><p> <a href="https://i.stack.imgur.com/Gh2Mx.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Gh2Mx.png" alt="在此處輸入圖像描述"></a></p><p> 這是 CUSTOMER.class:</p><pre> public class CUSTOMER { @XmlElements({ @XmlElement(name = "ADDRESS", type = ADDRESS.class), @XmlElement(name = "ZIP", type = ZIP.class), @XmlElement(name = "CITY", type = CITY.class), @XmlElement(name = "COUNTRY", type = COUNTRY.class), }) protected List&lt;Object&gt; addressAndZIPAndCITY; // other fields }</pre><p> 但是當我反序列化並從中創建 json 時,它僅包含:</p><pre> { "addressAndZIPAndCITY": [ { "value": "some value", "type": "some type" }, { "value": "some value 2", "type": "some type 2" }] }</pre><p> 缺少 ADRESS、ZIP、CITY 和 COUNTRY 對象標題。 所以反序列化不好。</p><p> 我無法更改List&lt;Object&gt;聲明。 是否可以選擇將其反序列化為帶有 ADRESS、ZIP、CITY 等的 json? 像這樣:</p><pre> { "addressAndZIPAndCITY": [{ "ADDRESS": { "value": "some value", "type": "some type" } }, { "ZIP": { "value": "some value 2", "type": "some type 2" } } ] }</pre><p> 編輯:我的意思是它看起來像 GSON 不知道哪個 object 在那里,但可能你知道如何向 model 添加一些注釋或其他東西來識別它?</p></div></object>
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM