通过GSON将类中的成员字段映射转换为JSON

时间:2014-01-06 15:35:56

标签: java json

我已经使用了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

为这些成员字段容器指定转换为json的方向

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

将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”, “名字”: “用户”, “姓氏”: “姓名”}} }}

答案 2 :(得分:0)

我终于解决了这个问题,我的问题是我没有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的反思程序有了更多的理解!