反序列化后获取 xml 格式字符串的空值

Getting null value for xml formatted string after Deserialization

我是 android.I 的初学者,我正在从我的 android 项目调用网络服务,其中 returns 一个 json 字符串作为响应,其中包含一个 xml格式化字符串作为一个条目。

String jsoncontent=restTemplate.getForObject(constr+"getAssetdata/{Id}", String.class, curAcct.getiD());
        final GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Assets.class, new AssetDeserialiser());
        final Gson gson = gsonBuilder.create();
       Assets assetAcc = gson.fromJson(jsoncontent, Assets.class);
        Toast.makeText(getApplicationContext(), assetAcc.getKeyValueData(), 68000).show();

下面是我作为网络服务响应得到的 json 字符串

jsoncontent={"id":39,"name":"ICICI Bank","purchaseValue":6000.0,"purchaseDate":1402403751000,"keyValueData":"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><root><Description><Name>Tax and other payments</Name><Value>433</Value></Description><Description><Name>Add more details...</Name><Value></Value></Description></root>"}

但是我在反序列化后得到了 assetAcc.getKeyValueData() 的空值,assets.How 中的其他字段没有问题来解决这个问题?请帮助我。

AssetDeserialiser.java:

public class AssetDeserialiser implements JsonDeserializer<Assets> {

@Override
public Assets deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {

    JsonObject jobject =arg0.getAsJsonObject();
    final Assets asset = new Assets();
    try{
    asset.setId(jobject.get("id").getAsInt());
    asset.setName(jobject.get("name").getAsString());
    asset.setPurchaseValue(jobject.get("purchaseValue").getAsFloat());
    asset.setPurchaseDate(new Timestamp(jobject.get("purchaseDate").getAsLong()));
    asset.setKeyValueData(jobject.get("keyValueData").isJsonNull() ? "" : jobject.get("keyValueData").getAsString());
    }catch(Exception es){
        System.out.println("es "+es);
    }
    return asset;
}

}

Assets.java:

public class Assets implements Serializable{

private Integer id;
private String name;
private Float purchaseValue;
private Timestamp purchaseDate;
private String keyValueData;

public Assets() {
    super();
    // TODO Auto-generated constructor stub
}

public Assets(Integer id, String name, Float purchaseValue, Timestamp purchaseDate, String keyValueData) {
    super();
    this.id = id;
    this.name = name;
    this.purchaseValue = purchaseValue;
    this.purchaseDate = purchaseDate;
    this.keyValueData = keyValueData;
}

public Integer getId() {
    return id;
}

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

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Float getPurchaseValue() {
    return purchaseValue;
}

public void setPurchaseValue(Float purchaseValue) {
    this.purchaseValue = purchaseValue;
}

public Timestamp getPurchaseDate() {
    return purchaseDate;
}

public void setPurchaseDate(Timestamp purchaseDate) {
    this.purchaseDate = purchaseDate;
}

public String getKeyValueData() {
    return keyValueData;
}

public void setKeyValueData(String keyValueData) {
    this.keyValueData = keyValueData;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    result = prime * result
            + ((keyValueData == null) ? 0 : keyValueData.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result
            + ((purchaseDate == null) ? 0 : purchaseDate.hashCode());
    result = prime * result
            + ((purchaseValue == null) ? 0 : purchaseValue.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Assets other = (Assets) obj;
    if (id == null) {
        if (other.id != null)
            return false;
    } else if (!id.equals(other.id))
        return false;
    if (keyValueData == null) {
        if (other.keyValueData != null)
            return false;
    } else if (!keyValueData.equals(other.keyValueData))
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    if (purchaseDate == null) {
        if (other.purchaseDate != null)
            return false;
    } else if (!purchaseDate.equals(other.purchaseDate))
        return false;
    if (purchaseValue == null) {
        if (other.purchaseValue != null)
            return false;
    } else if (!purchaseValue.equals(other.purchaseValue))
        return false;
    return true;
}

@Override
public String toString() {
    return name;
}


}
  • 1.Use Parcelable - 速度更快。
  • 2.Timestamp改长。 (然后可以像这样parce这个值):

    private String parceDate(data long){
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
       try {
          retrun df.format(your long from Assets.class);
           }catch (Exception e){
    return "";
      }
    }
    

更新:

Y 可以更改您的 getter 和 setter 以使用资产 class 中的时间戳对象,如下所示:

public void setPurchaseDate(long purchaseDate){
this.purchaseDate=purchaseDate
}

public Timestamp getPurchaseDate(){
return new Timestamp(purchaseDate); //from java.sql.Timestamp;
}

您可以在从包含 xml 字符串的 json 字符串反序列化后设置此 keyValueData,如下所示

String jsoncontent=restTemplate.getForObject(constr+"getAssetdata/{Id}", String.class, curAcct.getiD());
        final GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Assets.class, new AssetDeserialiser());
        final Gson gson = gsonBuilder.create();
       Assets assetAcc = gson.fromJson(jsoncontent, Assets.class);
        JSONObject jsonObj=new JSONObject(jsoncontent);
        assetAcc.setKeyValueData(jsonObj.getString("keyValueData"));

可以使用jackson进行反序列化。

public class AssetDeserialiser extends  JsonDeserializer<Asset> {

@Override
public Asset deserialize(JsonParser arg0, DeserializationContext arg1)
        throws IOException, JsonProcessingException {

    ObjectMapper mapper = new ObjectMapper();
    JsonNode node = mapper.readTree(arg0);
        final Asset asset = new Asset();
        try{
            asset.setId(mapper.readValue(node.get("id"),Integer.class));
            asset.setName(mapper.readValue(node.get("name"),String.class));
            asset.setPurchaseDate(mapper.readValue(node.get("purchaseDate"),Timestamp.class));
            asset.setPurchaseValue(mapper.readValue(node.get("purchaseValue"),Float.class));
            asset.setKeyValueData(mapper.readValue(node.get("keyValueData"), String.class));

        }catch(Exception es){
            System.out.println("es "+es);
        }
        return asset;
}

}

这可能对您有所帮助。 此外,您还必须在资产 class 的开头添加“@JsonDeserialize(using=AssetDeserialiser.class)”。它是这样完成的:

@JsonDeserialize(using=AssetDeserialiser.class)
public class Asset implements Serializable{