首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数组中有命名项的C#中解析/反序列化JSON

在数组中有命名项的C#中解析/反序列化JSON
EN

Stack Overflow用户
提问于 2015-03-26 16:43:58
回答 3查看 164关注 0票数 0

我需要反序列化以下JSON:

代码语言:javascript
复制
    "response": {
       "records": {
          "record-1": {
             "id": "1",
             "name": "foo"
        },
        "record-2": {                 
             "id": "2",
             "name": "foo"
        },
        "record-3": {
             "id": "3",
             "name": "foo-bar"
        }
      }
    }

我使用下面的C#代码来反序列化上面的JSON:

代码语言:javascript
复制
    HttpWebRequest httpWebRequest = System.Net.WebRequest.Create(requestUrl) as HttpWebRequest;
    using (HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse)
    {
        if (httpWebResponse.StatusCode != HttpStatusCode.OK)
            throw new Exception(string.Format("Server error (HTTP {0}: {1}).", httpWebResponse.StatusCode, httpWebResponse.StatusDescription));

        Stream stream = httpWebResponse.GetResponseStream());
        DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(MyResponseClass));
        objResponse = dataContractJsonSerializer.ReadObject(stream);
        if (objResponse == null)
            return null;
    }


    [DataContract]
    class MyResponseClass
    {
        [DataMember]
        public Response response { get; set; }
    }

    [DataContract]
    public class Response
    {
        [DataMember]
        public Records records { get; set; }
    }

    [DataContract]
    public class Records
    {
        [DataMember(Name = "record-1")]
        Record record_1 { get; set; }
        [DataMember(Name = "record-2")]
        Record record_2 { get; set; }
        [DataMember(Name = "record-3")]
        Record record_3 { get; set; }
    }
    [DataContract]
    public class Record
    {
        [DataMember]
        public string id { get; set; }
        [DataMember]
        public string name { get; set; }
    }

当然,有一种更好的方法来获取“记录”下的“记录”数组,这使得在代码中单独定义每条记录的可伸缩性变得不可伸缩。我知道可以使用JSON阅读器,但我更喜欢简单的反序列化例程。

我希望能够将JSON反序列化为记录列表(例如List,我如何实现这一点?

EN

回答 3

Stack Overflow用户

发布于 2015-03-26 18:48:27

我认为在您的情况下,最好完全删除Records类,并在Response类中将Records属性的类型更改为IDictionary<string, Record>。因此,您的类结构可能如下所示:

代码语言:javascript
复制
[DataContract]
class MyResponseClass
{
    [DataMember(Name = "response")]
    public Response Response { get; set; }
}

[DataContract]
public class Response
{
    [DataMember(Name = "records")]
    public IDictionary<string, Record> Records { get; set; }
}

[DataContract]
public class Record
{
    [DataMember(Name = "id")]
    public string Id { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }
}

您可以始终将JSON视为C#中的IDictionary<string, object>。它使理解JSON变得容易得多。

我还建议使用DataMember属性的Name属性,因为您可以保持C#属性的命名遵循指导原则。

票数 1
EN

Stack Overflow用户

发布于 2015-03-26 17:51:47

解决方案很简单你的json应该是这样的格式

代码语言:javascript
复制
{"response": {
       "records": {
          "record-1": {
             "id": "1",
             "name": "foo"
        },
        "record-2": {                 
             "id": "2",
             "name": "foo"
        },
        "record-3": {
             "id": "3",
             "name": "foo-bar"
        }
      }
    }
	}

要使用json.net解析这个json,只需运行下面的代码,它就会简单得多,而且功能也更强大。

代码语言:javascript
复制
 var recordsJson = jsonObject.SelectToken("response").SelectToken("records").Children<JProperty>().Select(p=>p.Value).ToList();
            foreach (var rec in recordsJson)
            {
                var record = JsonConvert.DeserializeObject<Record>(rec.ToString());
                Records.Add(record);
            }

我们将所有记录放到一个jobject列表中,然后以最简单的方式解析每条记录,并将每条记录添加到列表中。

票数 0
EN

Stack Overflow用户

发布于 2015-04-01 21:17:46

代码语言:javascript
复制
  MyResponse myResponse = null;

  HttpWebRequest httpWebRequest = System.Net.WebRequest.Create(requestUrl) as HttpWebRequest;
  using (HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse)
  {
    if (httpWebResponse.StatusCode != HttpStatusCode.OK)
        throw new Exception(string.Format("Server error (HTTP {0}: {1}).", httpWebResponse.StatusCode, httpWebResponse.StatusDescription));

    Stream stream = httpWebResponse.GetResponseStream());
    using (StreamReader streamReader = new StreamReader(stream))
    {
        myResponse = JsonConvert.DeserializeObject<MyResponse>(streamReader.ReadToEnd());

    }
  }

  return myResponse;



[DataContract]
class MyResponseClass
{
    [DataMember]
    public Response response { get; set; }
}

[DataContract]
public class Response
{
    [DataMember(Name = "records")]
    public IDictionary<string, Record> Records { get; set; }
}

[DataContract]
public class Record
{
    [DataMember]
    public string id { get; set; }
    [DataMember]
    public string name { get; set; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29274149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档