JSON.Net将集合序列化为数组数组

mhe*_*all 7 c# arrays json datatables json.net

默认情况下,DataTables Ajax期望JSON数据是一个数组数组.

使用JSON.Net是可以通过属性/设置将集合序列化为数组而不是对象数组,或者是否必须通过自定义完成JsonConverter.我试图序列化的对象如下:

public class DeviceIndex
{
    public int Id { get; set; }

    [Display(Name = "Asset Tag")]
    public string AssetTag { get; set; }

    [Display(Name = "Lease End")]
    [DataType(DataType.Date)]
    public DateTime LeaseEndDate { get; set; }

    public string Type { get; set; }

    [Display(Name = "Operating System")]
    public string OperatingSystem { get; set; }

    public string Model { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器动作如下:

public IActionResult IndexJson()
{
    var model = _db.Devices.Select(d => new DeviceIndex { ... }).ToList();
    return Content(JsonConvert.SerializeObject(new { data = model }), "application/json");
}
Run Code Online (Sandbox Code Playgroud)

哪个输出JSON:

{
  "data": [
    {
      "Id": 1649,
      ...
    },
    {
      "Id": 703,
      ...
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

虽然我期望的结果如下:

{
  "data": [
    [
      "1649",
      ...
    ],
    [
      "703",
      ...
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

我以为我可以为我的集合使用JsonArray属性,但它不会改变输出.

[JsonArray]
public class DevicesIndex: IEnumerable<DeviceIndex>
{
    List<DeviceIndex> devices;

    public IEnumerator<DeviceIndex> GetEnumerator()
    {
        return devices.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

mhe*_*all 1

看起来自定义JsonConverter是建议的方法

public class DeviceIndexJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DeviceIndex);
    }

    public override object ReadJson(JsonReader reader, 
                                    Type objectType, 
                                    object existingValue, 
                                    JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, 
                                   object value, 
                                   JsonSerializer serializer)
    {
        if (value == null) return;

        writer.WriteStartArray();

        var properties = value.GetType().GetProperties();
        foreach (var property in properties)
            writer.WriteValue(value.GetType().GetProperty(property.Name).GetValue(value));

        writer.WriteEndArray();
    }
}
Run Code Online (Sandbox Code Playgroud)