简体   繁体   中英

Getting null value for xml formatted string after Deserialization

I am a beginner in android.I am calling a webservice from my android project which returns a json string as response which contain a xml formatted string as one entry.

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();

Below is the json string that i got as webservice response

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>"}

But i am getting a null value for assetAcc.getKeyValueData() after deserialization,there is no isue with other fields in assets.How to solve this issue? Please help me.

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 -its much faster.
  • 2.Timestamp change to long. (Then can parce this value like this):

     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 ""; } } 

UPDATE :

Y can change your getter and setter for use Timestamp object from Assets class like this:

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

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

You can set this keyValueData after deserialisation from your json string that contain the xml string as below

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"));

You can use jackson for deserialization.

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;
}

}

This may help you. Also you will have to add "@JsonDeserialize(using=AssetDeserialiser.class)" at the beginning of your asset class. It is done like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM