使用C#将json字符串解析并存储到类中

时间:2012-10-27 10:48:59

标签: c# asp.net json asp.net-mvc-3

{
    "id" : 0,
    "name" : "meeting",
    "text" : "10 pm",
    "location" : "Place1",
    "startdate" : "10/27/2012 17:11",
    "enddate" : "10/27/2012 18:41",
    "description" : "Description",
    "chairman" : "0",
    "members" : [2, 1],
    "messagetype" : {
        "SMS" : false,
        "Email" : true
    },
    "smsmessage" : null,
    "emailmessage" : "this is message",
    "emailsubject" : null,
    "reminder" : "5",
    "timetosendemail" : "10/23/2012 00:00",
    "timetosendsms" : null
}

这是我的json字符串。我需要的是解析这个字符串并将每个值存储到类的特定成员中。

班级就像这样

public class Event
{

    public int id { get; set; }
    public string name {get;set;}
    public string text { get; set; }
    public DateTime start_date { get; set; }
    public DateTime end_date { get; set; }
    public string location { get; set; }
    public double ReminderAlert { get; set; }
    public MessagerType MessageType { get; set; }
    public string SmsMessage { get; set; }
    public string EmailMessage { get; set; }
    public string EmailSubject { get; set; }
    public DateTime TimeToSendEmail { get; set; }
    public DateTime TimeToSendSMS { get; set; }   
    public string[] members {get;set;}
}

我使用Json.net库来解析..我的代码片段在下面给出

var eventValues = JsonConvert.DeserializeObject<List<Dictionary<string, Event>>>(stringEvent);

运行此代码后,我收到此错误

  

无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List 1[System.Collections.Generic.Dictionary 2 [System.String,CalendarScheduler.Models.Event]]'因为类型需要JSON数组(例如[1,2,3])才能正确反序列化。

     

要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是可以从JSON对象反序列化的集合类型,如数组或List)。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。

     

路径'id',第1行,第6位。

应该采取什么措施来避免这种例外......?

2 个答案:

答案 0 :(得分:2)

这不起作用?

var eventValues = JsonConvert.DeserializeObject<Event>(stringEvent);

考虑Oded的评论。并将所有JSON属性名称与C#属性名称匹配。

答案 1 :(得分:0)

试试这个:

public T Deserialize<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    obj = (T)serializer.ReadObject(ms);
    ms.Close();
    return obj;
}

Event MyEvent = Deserialize<Event>(jsonString);