我已经使用了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
答案 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
的反思程序有了更多的理解!