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

Java 反序列化后获取xml格式字符串的空值,java,android,json,json-deserialization,Java,Android,Json,Json Deserialization,我是android的初学者。我正在从我的android项目调用一个Web服务,它返回一个json字符串作为响应,其中包含一个xml格式的字符串作为一个条目 String jsoncontent=restTemplate.getForObject(constr+"getAssetdata/{Id}", String.class, curAcct.getiD()); final GsonBuilder gsonBuilder = new GsonBuilder();

我是android的初学者。我正在从我的android项目调用一个Web服务,它返回一个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();
下面是作为webservice响应获得的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>"}
1.使用Parcelable——它快得多。 2.时间戳更改为long。然后可以像这样对该值进行分区:

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 "";
  }
}
public void setPurchaseDate(long purchaseDate){
this.purchaseDate=purchaseDate
}

public Timestamp getPurchaseDate(){
return new Timestamp(purchaseDate); //from java.sql.Timestamp;
}
@JsonDeserialize(using=AssetDeserialiser.class)
public class Asset implements Serializable{
更新:

Y可以从Assets类更改getter和setter以使用时间戳对象,如下所示:

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 "";
  }
}
public void setPurchaseDate(long purchaseDate){
this.purchaseDate=purchaseDate
}

public Timestamp getPurchaseDate(){
return new Timestamp(purchaseDate); //from java.sql.Timestamp;
}
@JsonDeserialize(using=AssetDeserialiser.class)
public class Asset implements Serializable{

您可以在从包含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;
}

请发布Logcat错误堆栈跟踪?System.out es java.lang.UnsupportedOperationException:JsonNull@plsdo null check可能与此类似,以确保它作为null jobject.getkeyValueData.isJsonNull拦截:jobject.getkeyValueData.getAsString并让我知道此项正在工作或尚未获得空值。请您更新我,您是如何完成上述空值检查代码的?抱歉,如果我将时间戳更改为long,则项目的其他方面会变得更复杂。我需要找到获取此keyValueData的方法。好的,如果需要从Assets.class获取时间戳对象,只需更改setter和getter,如下所示:public void setPurchaseDatelong purchaseDate{this.purchaseDate=purchaseDate;}public Timestamp getPurchaseDate{return new TimestamppurchaseDate;//from\java.sql.Timestamp;}