我有一个Json字符串,类似于以下内容:
{
EventID: 4,
CalendarEntry :
{
CalendarID: 4,
AreaID: 41,
Name: "My Event Entry #4"
}
}
我将顶级结构反序列化为代码中的Event实体,正确地将(4)添加到Id:
public class Event
{
[DataMember(Name = "EventID")]
public int Id { get; set; }
}
但是,当我将Calendar作为属性添加到Event时,两个Id总是返回null?
public class EventCalendar
{
[DataMember(Name = "CalendarID")]
public int Id { get; set; }
[DataMember(Name = "AreaID")]
public int AreaId { get; set; }
[DataMember(Name = "Name")]
public string Name { get; set; }
}
public class Event
{
[DataMember(Name = "EventID")]
public int Id { get; set; }
[DataMember(Name = "CalendarEntry")]
public EventCalendar Calendar { get; set; }
}
如果我从Id或AreaId中删除[DataMember]属性,并将其名称与我的JSON字符串完全相同,则会产生正确的结果。但是,我不想在我的实体中使用相同的名称,并期望[DataMember]正确地恢复数据?
我在.Net 4.5中使用JsonSerializer。
我也尝试过使用Newtonsoft.Json,它做同样的事情吗?
答案 0 :(得分:0)
{
EventID: 4,
CalendarEntry :
{
CalendarID: 4,
AreaID: 41,
Name: "My Event Entry #4"
}
}
也许: - ?
{
EventID: 4,
CalendarEntry :
[{
CalendarID: 4,
AreaID: 41,
Name: "My Event Entry #4"
}]
}
答案 1 :(得分:0)
这对我来说很好。验证输入的JSON字符串是否有效。
在此示例中,我使用的是System.Web.Script.Serialization
和System.Runtime.Serialization
public static void Main (string[] args)
{
JavaScriptSerializer ser = new JavaScriptSerializer();
string json = ser.Serialize(new Event {
Id = 4,
Calendar = new EventCalendar {
Id = 5,
AreaId = 55,
Name = "Some name"
}
});
Console.WriteLine(string.Format("json = {0}", json));
Event fromJsonEvent = ser.Deserialize<Event>(json);
Console.WriteLine(string.Format ("Event.Id = {0}", fromJsonEvent.Id));
Console.WriteLine(string.Format ("Event.EventCalendar.Name = {0}", fromJsonEvent.Calendar.Name));
Console.WriteLine(string.Format ("Event.EventCalendar.Id = {0}", fromJsonEvent.Calendar.Id));
}
}
public class EventCalendar
{
[DataMember(Name = "CalendarID")]
public int Id { get; set; }
[DataMember(Name = "AreaID")]
public int AreaId { get; set; }
[DataMember(Name = "Name")]
public string Name { get; set; }
}
public class Event
{
[DataMember(Name = "EventID")]
public int Id { get; set; }
[DataMember(Name = "CalendarEntry")]
public EventCalendar Calendar { get; set; }
}