使用Newtonsoft.JSON使用C#反序列化Json字符串

时间:2015-11-20 08:42:32

标签: c# json

我已经阅读了一些文章,但没有解决我的问题,我在反序列化时遇到了JSON字符串问题,这里是字符串

{"table":"sy_version","effected":2,"data":[{"mod_id":"CS","sub_mod":"sbm_sl.exe","version":"2015.11.07.1","upload_date ":"2015-11-10 11:34:13"},{"mod_id":"FA","sub_mod":"sbm_fa.exe","version":"2015.11.09","upload_date ":"2015-11-10 11:34:13"}]}    

这是我的班级

    public class Datum
    {
        public string mod_id { get; set; }
        public string sub_mod { get; set; }
        public string version { get; set; }
        public DateTime upload_date { get; set; }
    }

    public class sy_periode
    {
        public string table { get; set; }
        public int effected { get; set; }
        public IList<Datum> datas { get; set; }
    }

    public static void test(string str) {
        // dynamic sy_periode = JsonConvert.DeserializeObject(str);
        var sy_periode = JsonConvert.DeserializeObject<sy_periode>(str);
        foreach (var data in sy_periode.datas)
        {
            Console.WriteLine(data.sub_mod);
        }

    }

当我执行时,字符串受影响有值,但数据为空,这是错误消息

Object reference not set to an instance of an object.

1 个答案:

答案 0 :(得分:2)

它不应该是datas,它应该与JSON对象具有相同的名称:data

这是正确的类结构:

public class Datum
{
    public string mod_id { get; set; }
    public string sub_mod { get; set; }
    public string version { get; set; }
    public DateTime upload_date { get; set; }
}

public class sy_periode
{
    public string table { get; set; }
    public int effected { get; set; }
    public IList<Datum> data { get; set; }
}    

另请注意,在JSON中,您的upload_date属性最后会有一个奇怪的空格:upload_date。这可能是一个错字。但是,如果它是实际输入,并且由于C#成员名称不能包含空格,您可以尝试指定名称以便序列化它:

[JsonProperty(PropertyName = "upload_date ")]
public DateTime upload_date { get; set; }

我不太确定它会起作用,但我认为没有理由不这样做。