2017-04-12 133 views
0

在android项目中,即时通讯使用volley与API通讯。 在请求中的一个,我得到这个信息将Volley的JSONObject响应转换为POJO

{ 
"RgstrUsrRspn": { 
    "Hdr": { 
     "XchgId": "7403AC2E976D46968F6B4839E2FCB7A6", 
     "DtTm": "2017-04-12T09:48:17.856+0000" 
    }, 
    "RgstrUsr": { 
     "Rslt": { 
      "RsltStts": "DECL", 
      "RsltRsn": "" 
     } 
    } 
} 

}一个JSONObject响应

然后我要变成这个类的一个对象是:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "RegisterUserResponse1Document", propOrder = { 
    "rgstrUsrRspn" 
}) 
public class RegisterUserResponse1Document { 

    @XmlElement(name = "RgstrUsrRspn", required = true) 
    protected RegisterUserResponseV01 RgstrUsrRspn; 
//... 
} 

这些都是子类

public class RegisterUserResponseV01 { 

      @XmlElement(name = "Hdr", required = true) 
      protected Header2 Hdr; 
      @XmlElement(name = "RgstrUsr", required = true) 
      protected RegisterUserResponse1 RgstrUsr; 
     //... 
} 


public class Header2 { 

      @XmlElement(name = "XchgId", required = true) 
      protected String xchgId; 
      @XmlElement(name = "DtTm", required = true) 
      protected Date dtTm; 
      @XmlElement(name = "NxtFlow") 
      protected NextFlowCode nxtFlow; 
     //... 
} 

public class RegisterUserResponse1 { 

     @XmlElement(name = "TknData") 
     protected Token TknData; 
     @XmlElement(name = "Rslt", required = true) 
     protected Result1 Rslt; 
    //... 
} 

public class Result1 { 

    @XmlElement(name = "RsltStts", required = true) 
    protected ResultStatus RsltStts; //this is an enum 
    @XmlElement(name = "RsltRsn", required = true) 
    protected String RsltRsn; 
//... 
} 

当我从volley i获得成功响应触发此监听

@Override 
      public void notifySuccess(String requestType, JSONObject response) { 

       Log.e("RESPONSE Success",response.toString()); 
       Gson gson = new Gson(); 
       RegisterUserResponse1Document registerUserResponse1Document1 = (RegisterUserResponse1Document)JsonBuilder.fromJson(response.toString(),RegisterUserResponse1Document.class); 
       RegisterUserResponse1Document registerUserResponse1Document2 = gson.fromJson(response.toString(),RegisterUserResponse1Document.class); 
//.... 
} 

但两者registerUserResponse1Document1registerUserResponse1Document2得到填充空值。我应该使用另一种方法将响应转换为RegisterUserResponse1Document

编辑

JsonBuilder只是一些辅助方法类,像这样的

public static Object fromJson(String json, Class type){ 

     GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.setFieldNamingStrategy(FieldNamingPolicy.IDENTITY); 
     gsonBuilder.setDateFormat(DateFormat); 
     Gson gson = gsonBuilder.serializeNulls().create(); 
     return gson.fromJson(json, type); 
} 

EDIT 2

所有类都具有getter和setter方法,我只是被遗漏他们要缩短文本。

+1

'@ XmlElement'是XML,不是吗? –

+0

你的回复是JSON而不是XML – AlexTa

+1

也不确定'JsonBuilder.fromJson'在做什么,但这不是Gson –

回答

0

确保您为每个类属性都有正确的getter和setter,因为GSON通过反射将JSON转换为Object。

在任何情况下,你这个代码显示工作:

-----------------------------------com.example.Example.java----------------------------------- 

package com.example; 

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class Example { 

@SerializedName("RgstrUsrRspn") 
@Expose 
private RgstrUsrRspn rgstrUsrRspn; 

public RgstrUsrRspn getRgstrUsrRspn() { 
return rgstrUsrRspn; 
} 

public void setRgstrUsrRspn(RgstrUsrRspn rgstrUsrRspn) { 
this.rgstrUsrRspn = rgstrUsrRspn; 
} 

} 
-----------------------------------com.example.Hdr.java----------------------------------- 

package com.example; 

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class Hdr { 

@SerializedName("XchgId") 
@Expose 
private String xchgId; 
@SerializedName("DtTm") 
@Expose 
private String dtTm; 

public String getXchgId() { 
return xchgId; 
} 

public void setXchgId(String xchgId) { 
this.xchgId = xchgId; 
} 

public String getDtTm() { 
return dtTm; 
} 

public void setDtTm(String dtTm) { 
this.dtTm = dtTm; 
} 

} 
-----------------------------------com.example.RgstrUsr.java----------------------------------- 

package com.example; 

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class RgstrUsr { 

@SerializedName("Rslt") 
@Expose 
private Rslt rslt; 

public Rslt getRslt() { 
return rslt; 
} 

public void setRslt(Rslt rslt) { 
this.rslt = rslt; 
} 

} 
-----------------------------------com.example.RgstrUsrRspn.java----------------------------------- 

package com.example; 

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class RgstrUsrRspn { 

@SerializedName("Hdr") 
@Expose 
private Hdr hdr; 
@SerializedName("RgstrUsr") 
@Expose 
private RgstrUsr rgstrUsr; 

public Hdr getHdr() { 
return hdr; 
} 

public void setHdr(Hdr hdr) { 
this.hdr = hdr; 
} 

public RgstrUsr getRgstrUsr() { 
return rgstrUsr; 
} 

public void setRgstrUsr(RgstrUsr rgstrUsr) { 
this.rgstrUsr = rgstrUsr; 
} 

} 
-----------------------------------com.example.Rslt.java----------------------------------- 

package com.example; 

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class Rslt { 

@SerializedName("RsltStts") 
@Expose 
private String rsltStts; 
@SerializedName("RsltRsn") 
@Expose 
private String rsltRsn; 

public String getRsltStts() { 
return rsltStts; 
} 

public void setRsltStts(String rsltStts) { 
this.rsltStts = rsltStts; 
} 

public String getRsltRsn() { 
return rsltRsn; 
} 

public void setRsltRsn(String rsltRsn) { 
this.rsltRsn = rsltRsn; 
} 

} 
+0

是的,所有的课程都有getters和setters,我只是让他们在我的问题上有一个更短的文本,所以ppl不要去“tl:dr” – Ric

+0

@SergioA。很久以前,Gson并不关心访问器,而是使用反射来获取/设置字段。 –