我需要反序列化以下JSON:
"response": {
"records": {
"record-1": {
"id": "1",
"name": "foo"
},
"record-2": {
"id": "2",
"name": "foo"
},
"record-3": {
"id": "3",
"name": "foo-bar"
}
}
}我使用下面的C#代码来反序列化上面的JSON:
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,我如何实现这一点?
发布于 2015-03-26 18:48:27
我认为在您的情况下,最好完全删除Records类,并在Response类中将Records属性的类型更改为IDictionary<string, Record>。因此,您的类结构可能如下所示:
[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#属性的命名遵循指导原则。
发布于 2015-03-26 17:51:47
解决方案很简单你的json应该是这样的格式
{"response": {
"records": {
"record-1": {
"id": "1",
"name": "foo"
},
"record-2": {
"id": "2",
"name": "foo"
},
"record-3": {
"id": "3",
"name": "foo-bar"
}
}
}
}
要使用json.net解析这个json,只需运行下面的代码,它就会简单得多,而且功能也更强大。
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列表中,然后以最简单的方式解析每条记录,并将每条记录添加到列表中。
发布于 2015-04-01 21:17:46
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; }
}https://stackoverflow.com/questions/29274149
复制相似问题