代码之家  ›  专栏  ›  技术社区  ›  Hunt

使用JsonConverter存储传入json列表的泛型类

  •  1
  • Hunt  · 技术社区  · 7 年前

    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 参数能够存储从webservice获取的联系人列表、客户或订单数据。为了达到这个目的我试着 JsonConverter 控制反序列化进程。

    {
      "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 具有泛型类型的对象 接触 全部添加 数据到 . 所以有任何方法可以使这些东西通用化,我的意思是找到 contactList 或 customerList 或 orderList 动态创建 Response<Contact> Response<Customer> 等等。

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
        {
    
            JObject jObject = JObject.Load(reader);
    
            //For contact only
            JArray jArray = jObject.Property("contactsList").Value as JArray;
            Response<Contact> response = new Response<Contact>();
            response.responseBody = jArray.ToObject<IList<Contact>>();        
    
            serializer.Populate(jObject.CreateReader(), response);
            return response;
    
    
        }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Nkosi    7 年前

    我最初试着把它用作泛型属性,但有太多问题。

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

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