将json字符串反序列化为List <t>

时间:2016-10-11 12:10:38

标签: c# json json.net

我有一个以

形式输出JSON的Web服务
{"AppointmentList":[{"AppointmentList":{"id":"1","MeetingId":"1","MeetingName":"Test Meeting 1","Length":"90","Room":"B2C","DateTimeFrom":"1st Sept 2016","Venue":"The old pub","DateCreated":"2016-08-30 00:00:00","DateDue":"2016-09-01 00:00:00","UserId":"JohnsonPa"}},{"AppointmentList":{"id":"2","MeetingId":"2","MeetingName":"Test Meeting 2","Length":"60","Room":"B2C","DateTimeFrom":"11th Sept 2016","Venue":"The old pub","DateCreated":"2016-09-01 00:00:00","DateDue":"2016-09-12 00:00:00","UserId":"JohnsonPa"}...}]}

我正在尝试将此反序列化为List。通常,我会有一个基类,它将包含一个属性List AppointmentList {get;但是,这意味着我不能使用类型T,并且每个类都需要一堆重复的代码。

我当然可以使用属性public List Data创建BaseClass {get;但是,因为JSON不会反序列化为数据(名称不正确),并且JSON PropertyName不能设置为从typeof(T).ToString()派生的类名。

有没有办法实现我尝试做的事情而不需要大量的代码重复?

我已经尝试将deserialiser转换为JArray并从中创建一个读者,但这引发了异常。

3 个答案:

答案 0 :(得分:1)

我不确定这是否正是您所需要的,但也许这样的事情可行吗?它允许您成功反序列化为JArray,就像您在问题结束时所说的那样。

JArray result = JsonConvert.DeserializeObject<dynamic>(json).AppointmentList;

答案 1 :(得分:0)

此处如何将其转换为List<object>

dynamic data = JsonConvert.DeserializeObject(json);
JArray array = data.AppointmentList;

List<object> objectList = array.ToObject<List<object>>();

答案 2 :(得分:0)

仿制药有什么问题?如果你想要一个无模式数据结构,可以使用JObject或动态,如果没有,你可以试试这个。

 class Program
    {
        public const string json = @"{""AppointmentList"":[{""AppointmentList"":{""id"":""1"",""MeetingId"":""1"",""MeetingName"":""Test Meeting 1"",""Length"":""90"",""Room"":""B2C"",""DateTimeFrom"":""1st Sept 2016"",""Venue"":""The old pub"",""DateCreated"":""2016-08-30 00:00:00"",""DateDue"":""2016-09-01 00:00:00"",""UserId"":""JohnsonPa""}},{""AppointmentList"":{""id"":""2"",""MeetingId"":""2"",""MeetingName"":""Test Meeting 2"",""Length"":""60"",""Room"":""B2C"",""DateTimeFrom"":""11th Sept 2016"",""Venue"":""The old pub"",""DateCreated"":""2016-09-01 00:00:00"",""DateDue"":""2016-09-12 00:00:00"",""UserId"":""JohnsonPa""}}]}";

        static void Main(string[] args)
        {
            var items = Newtonsoft.Json.JsonConvert.DeserializeObject<AppointmentItemList<Meeting1>>(json).GetList();

            var items2 = Newtonsoft.Json.JsonConvert.DeserializeObject<AppointmentItemList<Meeting2>>(json).GetList();

            Console.ReadLine();
        }

        public class AppointmentItemList<T> 
        {
            public List<AppointmentItem> AppointmentList { get; set; }

            public class AppointmentItem 
            {
                public T AppointmentList { get; set; }
            }

            public IList<T> GetList()
            {
                return AppointmentList.Select(al => al.AppointmentList).ToList();
            }
        }

        public class Meeting1 
        {
            [Newtonsoft.Json.JsonProperty("id")]
            public string Id { get; set; }

            public string MeetingName { get; set; }
        }

        public class Meeting2
        {
            [Newtonsoft.Json.JsonProperty("id")]
            public string Id { get; set; }

            public string Room { get; set; }
        }
    }