繁体   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