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

泛型类的newtonSoft.DeserializeObject

  •  2
  • rcs  · 技术社区  · 7 年前

    我有一个JSON响应,如下所示

    {
        "msg": "1",
        "code": "2",
        "data": [
            {
                "a": "3",
                "b": "4"
            }
        ],
        "ts": "5"
    }
    

    我想创建一个通用类

    public class DTWSResponse<T>
    {
        public string msg { get; set; }
        public string code { get; set; }
        public T data { get; set; }
        public long ts { get; set; }
    }
    

    所以这个类将映射每个变量。但是 data 部分可以是通用的,即它可能具有不同的格式,而不是2个变量 a b .

    所以我创建了另一个类

    public class DTProf
    {
        public string a { get; set; }
        public string b { get; set; }
    }
    

    在我的代码中,我称为

    DTWSResponse<DTProf> prof = JsonConvert.DeserializeObject<DTWSResponse<DTProf>>(json);
    

    但我得到以下错误

    An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user code
    
    Additional information: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'DataTransfer.DTProfile' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
    
    To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
    
    Path 'data', line 1, position 40.
    

    有什么想法吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Nkosi    7 年前

    data

    var prof = JsonConvert.DeserializeObject<DTWSResponse<IList<DTProf>>>(json);
    var a = prof.data[0].a;
    
        2
  •  2
  •   Leo    7 年前

    data

    public class DTWSResponse<T>
    {
        public string msg { get; set; }
        public string code { get; set; }
        public IList<T> data { get; set; }
        public long ts { get; set; }
    }