Получение нулевого значения для строки в формате xml после десериализации

Я новичок в Android. Я вызываю веб-сервис из своего проекта Android, который возвращает строку 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>"}

Но я получаю нулевое значение для assetsAcc.getKeyValueData() после десериализации, с другими полями в активах проблем нет. Как решить эту проблему? Пожалуйста помогите.

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

}

Активы.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;
}


}

person KJEjava48    schedule 16.04.2015    source источник
comment
Не могли бы вы опубликовать трассировку стека ошибок Logcat?   -  person Sankar Ganesh PMP    schedule 16.04.2015
comment
System.out es java.lang.UnsupportedOperationException: JsonNull   -  person KJEjava48    schedule 16.04.2015
comment
@pls do null check может быть таким, чтобы убедиться, что он перехватывает как null jobject.get(keyValueData).isJsonNull() ? : jobject.get(keyValueData).getAsString() и дайте мне знать, работает это или нет   -  person Sankar Ganesh PMP    schedule 16.04.2015
comment
Все еще получаю нулевое значение   -  person KJEjava48    schedule 16.04.2015
comment
не могли бы вы сообщить мне, как вы сделали приведенный выше код нулевой проверки?   -  person Sankar Ganesh PMP    schedule 16.04.2015
comment
да, я обновил код   -  person KJEjava48    schedule 16.04.2015
comment
Я предлагаю вам написать код как метод и отлаживать его, будь то jobject.get(keyValueData).getAsString() как null , я думаю, мы должны перехватывать как jobject.get(keyValueData).getAsJsonObject() вместо String   -  person Sankar Ganesh PMP    schedule 16.04.2015


Ответы (3)


Вы можете установить этот keyValueData после десериализации из вашей строки 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);
        JSONObject jsonObj=new JSONObject(jsoncontent);
        assetAcc.setKeyValueData(jsonObj.getString("keyValueData"));
person user2986084    schedule 16.04.2015

  • 1. Используйте Parcelable - это намного быстрее.
  • 2.Временная метка меняется на длинную. (Затем можно разобрать это значение следующим образом):

    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 может изменить ваш геттер и сеттер для использования объекта Timestamp из класса Assets следующим образом:

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

public Timestamp getPurchaseDate(){
return new Timestamp(purchaseDate); //from java.sql.Timestamp;
}
person Leonid Veremchuk    schedule 16.04.2015
comment
Извините, если я изменю временную метку на длинную, это станет более сложным на других сторонах проекта. Мне нужно найти способ получить эти данные keyValueData. - person KJEjava48; 16.04.2015
comment
Хорошо, если вам нужно получить объект Timestamp из Assets.class, просто измените свой сеттер и геттер следующим образом: } public Timestamp getPurchaseDate() { вернуть новую Timestamp(purchaseDate); //из \java.sql.Timestamp; } - person Leonid Veremchuk; 16.04.2015

Вы можете использовать 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;
}

}

Это может помочь вам. Также вам нужно будет добавить «@JsonDeserialize(using=AssetDeserialiser.class)» в начале вашего класса активов. Это делается так:

@JsonDeserialize(using=AssetDeserialiser.class)
public class Asset implements Serializable{
person Manjiri lakhote    schedule 16.04.2015