【问题标题】:How to deserialize complex JSON-Objects from a WCF-Service in Android?如何从 Android 中的 WCF 服务反序列化复杂的 JSON 对象?
【发布时间】:2012-09-16 15:29:58
【问题描述】:

我有一个生成以下 JSON 的 REST WCF 服务。

{
   "RecordsUpdateResult":[
      {
         "ID":115,
         "Crud":2,
         "Data":{
            "__type":"Client:#PIT.Library.AndroidClasses",
            "ID":115,
            "Adress":"str. 1",
            "City":"Luzern",
            "Description":"Client 115",
            "PostalCode":6000
         }
      },
      {
         "ID":128,
         "Crud":2,
         "Data":{
            "__type":"Client:#PIT.Library.AndroidClasses",
            "ID":128,
            "Adress":"",
            "City":"",
            "Description":"Client 128",
            "PostalCode":0
         }
      }
   ]
}

如何使用 gson 库在 android 手机上反序列化?

我怀疑问题出在 "__type":"Client:#PIT.Library.AndroidClasses" 上。 我在 Android 端有一个名为“Client”的类。

我想将此 JSON 反序列化为以下类。

public class StammdatenUpdate extends ObjectBase
{
    @SerializedName("Crud")
    private CRUD    crud;
    @SerializedName("Data")
    private Object  data;

    @Override
    public String getSha1Hash()
    {
        // TODO Auto-generated method stub
        return null;
    }

    public synchronized CRUD getCrud()
    {
        return crud;
    }

    public synchronized void setCrud(CRUD crud)
    {
        this.crud = crud;
    }

    public synchronized Object getData()
    {
        return data;
    }

    public synchronized void setData(Object data)
    {
        this.data = data;
    }
}

属性 ID 在基类中。

    ...
    Type listType = new TypeToken<ArrayList<StammdatenUpdate>>()
        {}.getType();
    Gson gson = new GsonBuilder().create();

    // List<StammdatenUpdate> RecordsUpdate(StammdatenType type, Dictionary<long, string> listWithHashes)
    postData.setParameter(new String[] { "type", "listWithHashes" });
    postData.setValues(new String[] { gson.toJson(StammdatenType.CLIENT), gson.toJson(map) });

    String json = post.execute(postData);

    List<StammdatenUpdate> retValue = null;
    if(Tools.isNullOrEmpty(json) == false)
    {

        retValue = gson.fromJson(json, listType);
    }

    return retValue;

【问题讨论】:

  • 这篇文章的答案对你有帮助吗? stackoverflow.com/questions/12197138/…
  • 并非如此。我使用 gson,我的类具有 @SerializedName 属性。
  • 答案也是针对gson的,例子也有@SerializedName属性...你能不能也贴一下你发出请求的类并处理响应?
  • 我已经更新了代码示例。

标签: android json wcf deserialization


【解决方案1】:

从以下位置更改 WCF 注释:

BodyStyle = WebMessageBodyStyle.包裹

到:

BodyStyle = WebMessageBodyStyle.WrappedRequest

这会将 JSON 更改为:

   {
       "RecordsUpdateResult":[
          {
             "ID":115,
             "Crud":2,
             "Data":{

到:

[
          {
             "ID":115,
             "Crud":2,
             "Data":{

反序列化工作正常。

    Type listType = new TypeToken<ArrayList<StammdatenUpdate>>()
        {}.getType();
    Gson gson = new GsonBuilder().create();

    List<StammdatenUpdate> retValue = null;
    if(Tools.isNullOrEmpty(json) == false)
    {
        retValue = gson.fromJson(json, listType);
    }

    return retValue;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多