无法反序列化Json格式

时间:2015-04-17 23:05:14

标签: c# json

我不能去除这个Json结果

Json Result

我有这个代码

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        try
        {
            WebResponse response = request.GetResponse();
            using (Stream responseStream = response.GetResponseStream())
            {
                using (TextReader reader = new StreamReader(responseStream, true))
                {
                    valor = reader.ReadToEnd();
                }

                using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(valor)))
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<ApiData>));
                    List<ApiData> obj = (List<ApiData>)serializer.ReadObject(stream);
                }
            }
        }
        catch (WebException ex)
        {
            WebResponse errorResponse = ex.Response;
            using (Stream responseStream = errorResponse.GetResponseStream())
            {
                StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                String errorText = reader.ReadToEnd();
            }
            throw;
        }

但结果obj为null

ApiData示例

    [DataContract]
    public class ApiData
    {
        [DataMember(Order = 1)]
        public string coArt { get; set; }
        [DataMember(Order = 2)]
        public string artDes { get; set; }
        [DataMember(Order = 3)]
        public string fechaReg { get; set; }
        [DataMember(Order = 4)]
        public bool manjSer { get; set; }
        [DataMember(Order = 5)]
    }

任何人都可以帮助我或告诉我代码或格式转换的错误?谢谢你

1 个答案:

答案 0 :(得分:2)

您的根JSON实体不是一个列表,它是一个具有名称/值对的对象,第一个名称是0,值是您的ApiData类的实例。要对其进行反序列化,您应该使用Dictionary<string, ApiData>(或Dictionary<int, ApiData>,如果您确定只有数字显示为键)。

因此:

        var serializer = new DataContractJsonSerializer(typeof(Dictionary<string, ApiData>), new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true });
        var dict = (Dictionary<string, ApiData>)serializer.ReadObject(stream);

请注意,您必须将DataContractJsonSerializerSettings.UseSimpleDictionaryFormat = true设置为使用DataContractJsonSerializer来解析此格式的词典 - 此设置仅在.Net 4.5开始时可用。