【问题标题】:JSON.Net Serialize Collection To Array of ArraysJSON.Net 将集合序列化为数组数组
【发布时间】:2017-04-07 17:43:52
【问题描述】:

默认情况下,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; }
}

而我的控制器动作如下:

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

哪个输出 JSON:

{
  "data": [
    {
      "Id": 1649,
      ...
    },
    {
      "Id": 703,
      ...
    }
  ]
}

虽然我想要的结果如下:

{
  "data": [
    [
      "1649",
      ...
    ],
    [
      "703",
      ...
    ]
  ]
}

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

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

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

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

【问题讨论】:

标签: c# arrays json datatables json.net


【解决方案1】:

您可以通过简单的方式实现它,只需使用此简单示例更新您的 IndexJson() 方法。

你需要序列化List&lt;List&lt;object&gt;&gt;,试试这个示例。这是List&lt;string&gt; 的列表。

public IActionResult IndexJson()
    {
        List<List<string>> data = new List<List<string>>();

        data.Add(new List<string>(new string[] {"test1", "test2"}));
        data.Add(new List<string>(new string[] {"test3", "test4"}));

        var json = JsonConvert.SerializeObject(new {data = data});
        return Content(json, "application/json");
    }

你会得到这个 JSON

{
  "data":[
    ["test1","test2"],
    ["test3","test4"]
]}

使用您的数据模型

   List<List<string>> data =new List<List<string>>();

        List<DeviceIndex> deviceIndex = new List<DeviceIndex>();
        DeviceIndex item = new DeviceIndex();
        item.Id = 111;
        item.AssetTag = "Tag";
        item.LeaseEndDate = DateTime.Now;
        item.Type = "Type";
        item.OperatingSystem = "OS";
        item.Model = "Model";

        deviceIndex.Add(item);
        deviceIndex.Add(item);

        foreach (var device in deviceIndex)
        {

            data.Add(new List<string>(new string[] { device.Id.ToString(), device.AssetTag, device.AssetTag, device.OperatingSystem }));
        }

       var json =  JsonConvert.SerializeObject(new {data= data });

JSON

{
 "data":[
   ["111","Tag","Tag","OS"],
   ["111","Tag","Tag","OS"]
  ]
}

【讨论】:

  • 您的第一个示例提供了所需的输出,但使用类的第二个示例没有。不应输出属性名称,并且所有值都应在数组中,而不是数组中的对象。
【解决方案2】:

看起来自定义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();
    }
}

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多