在c#中反序列化字符串到列表类

时间:2014-05-11 22:15:44

标签: c# json string serialization

我的json字符串数据是

string r= "{"data":
[
{"ForecastID":54239761,"StatusForecast":"Done"},
{"ForecastID":54240102,"StatusForecast":"Done"},
{"ForecastID":54240400,"StatusForecast":"Done"},
{"ForecastID":54240411,"StatusForecast":"Done"},
{"ForecastID":54240417,"StatusForecast":"Done"}
]
}"

我的json类是

public class Datum
        {
            public string ForecastID { get; set; }
            public string StatusForecast { get; set; }
        }

        public class RootObject
        {
            public List<Datum> data { get; set; }
        }

我运行此代码

JavaScriptSerializer serializer = new JavaScriptSerializer();
List<Datum> ListAnswers = serializer.Deserialize<List<Datum>>(r);
Console.WriteLine("\n Deserialize: \n" + ListAnswers.Count  );

并且有0个ListAnswers.Count

但应该是5件。

什么错了?如何正确反序列化json字符串?

2 个答案:

答案 0 :(得分:2)

您需要反序列化RootObject的实例,因为它是数据的根。你现在要做的是将整个事物反序列化为一个列表..它不是。它是一个根对象,下面有一个列表:

RootObject obj = serializer.Deserialize<RootObject>(r);
foreach (var item in obj.data) {
    Console.WriteLine("\n Deserialize: \n" + item.ForecastID);
}

答案 1 :(得分:0)

看起来你的JSON字符串是一个对象,而不是一个数组。为了将JSON直接解析为List,JSON应该是一个数组。

因此,在上面的示例中,如果您将JSON字符串修改为

[
  {"ForecastID":54239761,"StatusForecast":"Done"},
  {"ForecastID":54240102,"StatusForecast":"Done"},
  {"ForecastID":54240400,"StatusForecast":"Done"},
  {"ForecastID":54240411,"StatusForecast":"Done"},
  {"ForecastID":54240417,"StatusForecast":"Done"}
]

它会像你期望的那样解析。

另一个选择是创建一个辅助C#类来反映JSON的结构。这些方面的东西:

public class DataContainer
{
    public List<Datum> Data {get;set;}
}

这提供了JSON字符串中包含的“data”属性,因此序列化程序将使用Datum对象列表填充Data属性。您的调用代码将如下所示:

JavaScriptSerializer serializer = new JavaScriptSerializer();
DataContainer results = serializer.Deserialize<DataContainer>(r);
Console.WriteLine("\n Deserialize: \n" + results.Data.Count  );