2015-04-16 2 views
0

Je suis un débutant dans android.J'appelle un webservice de mon projet android qui renvoie une chaîne json comme réponse qui contient une chaîne au format xml comme une entrée.Obtention d'une valeur nulle pour la chaîne au format xml après la désérialisation

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

Ci-dessous la chaîne JSON que je suis arrivé comme réponse webservice

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

mais je reçois une valeur nulle pour assetAcc.getKeyValueData() après désérialisation, il n'y a pas isue avec d'autres domaines de l'actif Comment résoudre ce problème? Aidez-moi, s'il vous plaît.

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


} 
+0

Pourriez-vous s'il vous plaît signaler la trace de pile d'erreur de Logcat? –

+0

System.out es java.lang.UnsupportedOperationException: JsonNull – KJEjava48

+0

@pls check null peut être comme ceci pour s'assurer qu'il intercepte comme null jobject.get ("keyValueData"). IsJsonNull()? "": jobject.get ("keyValueData"). getAsString() et laissez-moi savoir que cela fonctionne ou non –

Répondre

0

Vous pouvez définir keyValueData après la désérialisation de votre chaîne json contenant la chaîne xml comme suit:

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")); 
0
  • 1.Utiliser Parcelable -ses beaucoup plus rapide.
  • 2.Timestamp changer à long. (Alors peut Parcé cette valeur comme celui-ci):

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

MISE À JOUR:

Y peut changer votre getter et setter pour objet l'utilisation Timestamp de la classe des actifs comme ceci:

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

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

Désolé, si je change timestamp trop longtemps, il deviendra plus compliqué sur les autres côtés du projet. Je dois obtenir un moyen d'obtenir ce keyValueData. – KJEjava48

+0

Ok, si vous avez besoin d'obtenir l'objet Timestamp à partir de Assets.class, changez simplement votre setter et getter comme ceci: public void setPurchaseDate (long purchaseDate) { this.purchaseDate = purchaseDate; } public Timestamp getPurchaseDate() { return new Horodatage (purchaseDate); // à partir de \ java.sql.Timestamp; } –

0

Vous pouvez utiliser jackson pour la désérialisation.

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

}

Cela peut vous aider. Vous devrez également ajouter "@JsonDeserialize (using = AssetDeserialiser.class)" au début de votre classe d'actifs. Il est fait comme ceci:

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