簡體   English   中英

通過GSON將類中的成員字段映射轉換為JSON

[英]convert member field map in class into JSON by GSON

我已經使用了GSON一段時間了,我認為它非常有用!
今天我遇到了一個問題,我想這可能是指GSON一些高級用法。
這是我的班級定義:

class ResolvedID
{
    private String type;
    private HashMap<String,String> data=new HashMap<>(4);

    public String getType()
    {
        return this.type;
    }
    public void setType(String type)
    {
        this.type=type;
    }
    public void put(String K, String V)
    {
        this.data.put(K,V);
    }
}

在那之后我將以一些合適的方式執行以下操作,這里我只是簡單地寫一下:
我將把一些數據放入這個哈希映射:

ResolvedID id=new ResolvedID();
id.setType("Bachelor");
id.put("school","Computer Science School");
id.put("major","Software Engineering");
id.put("grade","2009");

我希望GSON可能將其轉換為
{"type":"Bachelor", "data":{"school":"Computer Science School", "grade":"2009", "major":"Software Engineering"}}

但不幸的是我只得到了
{"type":"Bachelor"}}

任何人GSON這類成員字段容器指定一些方向,以便由GSON轉換為json

這個

A a = new A();
a.data = new HashMap<>();
a.type="teacher";
a.data.put("degree","bachelor");
a.data.put("grade","2013");
Gson gson = new Gson();
System.out.println(gson.toJson(a));

版畫

{"type":"teacher","data":{"degree":"bachelor","grade":"2013"}}

為了我。

您不能初始化data 默認情況下,Gson如果為null則不會序列化字段。

將JavaBeans與嵌套類一起使用可能更容易。 這是一個例子:

注意:顯然你會以不同的方式構建你的JsonResponseData類 - 我只是在類中設置前綴值以獲得一個快速示例。

嵌套Pojo:

public class JsonResponseData {

    private JsonResponse mResponse = new JsonResponse();

    public JsonResponse getJsonResponse(){
        return mResponse;
    }

    public void setJsonResponse(JsonResponse mResponse){
        this.mResponse = mResponse;
    }

    private static class JsonResponse {
        private int part = 1;
        private UserData data = new UserData();
    }

    private static class UserData {
        private User user = new User();

        public User getUser(){
            return user;
        }

        public void setUser(User user){
            this.user = user;
        }
    }

    public static class User {
        private String id = "5";
        private String firstName = "User";
        private String lastName = "Name";

        public String getId(){
            return id;
        }

        public void setId(String id){
            this.id = id;
        }

        public String getFirstName(){
            return firstName;
        }

        public void setFirstName(String firstName){
            this.firstName = firstName;
        }

        public String getLastName(){
            return lastName;
        }

        public void setLastName(String lastName){
            this.lastName = lastName;
        }
    }

}

測試類:

public class Test {

    private static Gson gson;
    private static JsonResponseData data;

    public static void main(String[] args){
        gson = new Gson();
        data = new JsonResponseData();

        System.out.print(gson.toJson(data));

    }

}

輸出:

{ “mResponse”:{ “部分”:1, “數據”:{ “用戶”:{ “ID”: “5”, “名字”: “用戶”, “姓氏”: “姓名”}}}}

我終於解決了這個問題,我的問題是我沒有這個哈希映射的getter ,我認為GSON會使用反映成員字段。

如果成員字段是公共范圍的,則GSON可以獲取這些字段並對其進行序列化。
如果成員字段是私有作用域, GSON將通過getter獲取它們,因此GSON無法序列化那些沒有getter私有字段,就像我上面的實例一樣。

class ResolvedID
{
    private String type;
    private HashMap<String,String> data=new HashMap<>(4);

    public String getType()
    {
        return this.type;
    }
    public void setType(String type)
    {
        this.type=type;
    }
    //----getter is important for private member field to be reflected by GSON!
    public HashMap getData()
    {
        return this.data;
    }
    public void put(String K, String V)
    {
        this.data.put(K,V);
    }
}

為我的班級添加一個getter后,它現在已成功執行! 現在我對GSON的反射程序GSON更多的理解!

暫無
暫無

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

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