使用JsonConverter

时间:2018-11-16 08:03:18

标签: c# xamarin json.net realm json-deserialization

我正在尝试创建一个通用类,该类可以存储任何类型的传入json的响应以避免开箱,我限制T必须从RealmObject派生

public class Response<T>  where T : RealmObject
{
    public string errorMessage { get; set; }
    public string status { get; set; }
    public string totalPages {get;set;}

    public IList<T> responseBody { get; set; }
}

在这里,responseBody参数能够存储从Web服务获取的联系人列表,客户或订单数据。为了实现我试图 扩展JsonConverter以控制反序列化过程。

从服务器收到的Json如下(用于联系人类型数据)

{
  "errorMessage": "",
  "status": "Ok",
  "totalPages": 1,
  "contactsList": [
    {
      "firstName": "Ronald",
      "lastName": "Brownn"
    },
    {

      "firstName": "Elvis",
      "lastName": "Presley"
    }
  ]
}

以下是我的Contact模型

[JsonCustomAttribute("contactsList")]

public class Contact : RealmObject
{

    public string firstName {get;set;}

    public string lastName { get; set; }        

}

到目前为止,我正在尝试使用JsonConverter来反序列化传入的json。在这里您可以看到我必须显式地找到contactsList属性,然后需要创建具有通用类型Response的{​​{1}}对象以将所有Contact数据添加到 Contact。因此,有什么方法可以使这些东西通用化,我的意思是动态找到responseBodycontactListcustomerList并动态创建orderListResponse<Contact>等。 / p>

Response<Customer>

1 个答案:

答案 0 :(得分:2)

最初,我尝试将它用作通用属性,但问题太多了。

这是使用基于提供的类型的命名约定的转换器

public class ResponseConverter<T> : JsonConverter<Response<T>> where T : RealmObject {

    public override Response<T> ReadJson(JsonReader reader, Type objectType, Response<T> existingValue, bool hasExistingValue, JsonSerializer serializer) {
        JObject jObject = JObject.Load(reader);

        var typeName = typeof(T).Name;
        var propertyName = string.Format("{0}List", typeName);

        var response = new Response<T>();

        if (jObject.ContainsKey(propertyName) && jObject[propertyName].Type == JTokenType.Array) {
            response.responseBody = jObject.Property(propertyName).ToObject<IList<T>>();
        } else {
            response.responseBody = Enumerable.Empty<T>().ToList();
        }
        serializer.Populate(jObject.CreateReader(), response);
        return response;
    }

    public override void WriteJson(JsonWriter writer, Response<T> value, JsonSerializer serializer) {
        throw new NotImplementedException();
    }
}

手动使用它看起来像这样

var response = JsonConvert.DeserializeObject<Response<Contact>>(json, new ResponseConverter<Contact>());

对于不同类型的响应,您可以创建派生类并将转换器应用于该响应

喜欢

[JsonConverter(typeof(ResponseConverter<Contact>))]
public class ContactResponse : Response<Contact> { }

[JsonConverter(typeof(ResponseConverter<Customer>))]
public class CustomerResponse : Response<Customer> { }