C# Json.Net将集合序列化为命名属性

C# Json.Net将集合序列化为命名属性,c#,json,xamarin,json.net,refit,C#,Json,Xamarin,Json.net,Refit,我正在创建一个Xamarin应用程序,其中包含由和其他库管理的API调用,并正在考虑将对象集合序列化为Json属性数组 我的问题是如何使用Json.Net将MemberBooking类型中的MemberSlot对象集合序列化为所需的Json 对象的名称将始终为数字1->4,但部分或全部可能不存在 问题 { "member_booking_request":{ "course_id":1, "date":"2016-09-29", "time":"

我正在创建一个Xamarin应用程序,其中包含由和其他库管理的API调用,并正在考虑将对象集合序列化为Json属性数组

我的问题是如何使用Json.Net将MemberBooking类型中的MemberSlot对象集合序列化为所需的Json

对象的名称将始终为数字1->4,但部分或全部可能不存在

问题

{  
   "member_booking_request":{  
      "course_id":1,
      "date":"2016-09-29",
      "time":"09:00",
      "slots":[  
         {  
            "type":"Member",
            "holes":18,
            "user_id":110
         },
         {  
            "type":"Member",
            "holes":18,
            "user_id":111
         },
         {  
            "type":"Member",
            "holes":18,
            "user_id":112
         },
         {  
            "type":"Member",
            "holes":18,
            "user_id":117
         ]
      }
   }
}
{  
   "member_booking_request":{  
      "course_id":1,
      "date":"2016-09-29",
      "time":"09:00",
      "slots":{  
         "1":{  
            "type":"Member",
            "holes":18,
            "user_id":110
         },
         "2":{  
            "type":"Member",
            "holes":18,
            "user_id":111
         },
         "3":{  
            "type":"Member",
            "holes":18,
            "user_id":112
         },
         "4":{  
            "type":"Member",
            "holes":18,
            "user_id":117
         }
      }
   }
}
我是否可以将MemberBooking对象中的List属性更改为Dictionary并适当填充字符串键

对象继承权

public class MemberBookingRequest
{
    [JsonProperty("member_booking_request")]
    public MemberBooking Booking { get; set; }
}

public class MemberBooking
{
    [JsonProperty("course_id")]
    public int CourseId { get; set; }

    [JsonProperty("date")]
    public string TeeDate { get; set; }

    [JsonProperty("time")]
    public string TeeTime { get; set; }

    [JsonProperty("slots")]
    public List<MemberSlot> Slots { get; set; }
}

public class MemberSlot
{
    [JsonIgnore]
    public int Id { get; set; }

    [JsonProperty("type")]
    public BookingType Type { get; set; }

    [JsonProperty("holes")]
    public int Holes { get; set; }

    [JsonProperty("user_id")]
    public int MemberId { get; set; }
}
所需的Json

{  
   "member_booking_request":{  
      "course_id":1,
      "date":"2016-09-29",
      "time":"09:00",
      "slots":[  
         {  
            "type":"Member",
            "holes":18,
            "user_id":110
         },
         {  
            "type":"Member",
            "holes":18,
            "user_id":111
         },
         {  
            "type":"Member",
            "holes":18,
            "user_id":112
         },
         {  
            "type":"Member",
            "holes":18,
            "user_id":117
         ]
      }
   }
}
{  
   "member_booking_request":{  
      "course_id":1,
      "date":"2016-09-29",
      "time":"09:00",
      "slots":{  
         "1":{  
            "type":"Member",
            "holes":18,
            "user_id":110
         },
         "2":{  
            "type":"Member",
            "holes":18,
            "user_id":111
         },
         "3":{  
            "type":"Member",
            "holes":18,
            "user_id":112
         },
         "4":{  
            "type":"Member",
            "holes":18,
            "user_id":117
         }
      }
   }
}

您必须更改创建插槽属性的方式。在填充插槽字典时,将MemberSlot.Id指定为键,将MemberSlot本身指定为值

public class MemberBooking
    {
        [JsonProperty("course_id")]
        public int CourseId { get; set; }

        [JsonProperty("date")]
        public string TeeDate { get; set; }

        [JsonProperty("time")]
        public string TeeTime { get; set; }

        [JsonProperty("slots")]
        public Dictionary<int,MemberSlot> Slots { get; set; }
    }
public class会员预订
{
[JsonProperty(“课程id”)]
public int CourseId{get;set;}
[JsonProperty(“日期”)]
公共字符串TeeDate{get;set;}
[JsonProperty(“时间”)]
公共字符串TeeTime{get;set;}
[JsonProperty(“插槽”)]
公共字典槽{get;set;}
}

此示例将使用字典提供所需的json输出

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Newtonsoft.Json;

    namespace jsonconversion
    {
    public class Program
    {

        public static void Main(string[] args)
        {
            Dictionary<int,MemberSlot> slots=new Dictionary<int, MemberSlot>();
            MemberSlot slot1 = new MemberSlot() {Id = 1, Holes =2, MemberId =     1};
            slots.Add(1,slot1);
            MemberBookingRequest mbr = new MemberBookingRequest
            {
                Booking = new MemberBooking()
                    {CourseId = 1, TeeDate ="",TeeTime = "",Slots = slots}
            };
            string jd = JsonConvert.SerializeObject(mbr);
            Console.WriteLine(jd);
        }
    }



    public class MemberBookingRequest
    {
        [JsonProperty("member_booking_request")]
        public MemberBooking Booking { get; set; }
    }

    public class MemberBooking
    {
        [JsonProperty("course_id")]
        public int CourseId { get; set; }

        [JsonProperty("date")]
        public string TeeDate { get; set; }

        [JsonProperty("time")]
        public string TeeTime { get; set; }

        [JsonProperty("slots")]
        public Dictionary<int, MemberSlot> Slots { get; set; }
    }

    public class MemberSlot
    {
        [JsonIgnore]
        public int Id { get; set; }


        [JsonProperty("holes")]
        public int Holes { get; set; }

        [JsonProperty("user_id")]
        public int MemberId { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Newtonsoft.Json;
名称空间JSONversion
{
公共课程
{
公共静态void Main(字符串[]args)
{
字典槽=新字典();
MemberSlot slot1=new MemberSlot(){Id=1,Holes=2,MemberId=1};
插槽。添加(1,插槽1);
MemberBookingRequest mbr=新建MemberBookingRequest
{
预订=新会员预订()
{CourseId=1,TeeDate=“”,TeeTime=“”,Slots=Slots}
};
字符串jd=JsonConvert.SerializeObject(mbr);
控制台写入线(jd);
}
}
公共类MemberBookingRequest
{
[JsonProperty(“会员预订请求”)]
公共会员预订{get;set;}
}
公开课会员预订
{
[JsonProperty(“课程id”)]
public int CourseId{get;set;}
[JsonProperty(“日期”)]
公共字符串TeeDate{get;set;}
[JsonProperty(“时间”)]
公共字符串TeeTime{get;set;}
[JsonProperty(“插槽”)]
公共字典槽{get;set;}
}
公共类成员槽
{
[JsonIgnore]
公共int Id{get;set;}
[JsonProperty(“孔”)]
公共整数孔{get;set;}
[JsonProperty(“用户id”)]
public int MemberId{get;set;}
}
}

您可以显示“所需的json”,但如果您也显示“当前的json”,那就更好了!