Json反序列化空引用

时间:2012-12-24 10:16:44

标签: json

我有一个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,它做同样的事情吗?

2 个答案:

答案 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.SerializationSystem.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; }
}