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

Posted

技术标签:

【中文标题】JSON.Net 将集合序列化为数组数组【英文标题】:JSON.Net Serialize Collection To Array of Arrays 【发布时间】: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();
    

【问题讨论】:

所以你需要json看起来像你的第一个json,一个数组对象的数组?如果是,您必须序列化 List> 这将是 json 作为数组字符串的数组。 与C# JSON.NET - Deserialize response that uses an unusual data structure 相似或重复。 【参考方案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();
    

【讨论】:

以上是关于JSON.Net 将集合序列化为数组数组的主要内容,如果未能解决你的问题,请参考以下文章

Json.NET:将嵌套数组反序列化为强类型对象

使用 JSON.NET 一次序列化一组对象

使用 Json.NET 将异构 JSON 数组反序列化为协变 List<>

如何使用 kotlinx 序列化将值数组反序列化为集合

使用来自 URL 的 JSON.NET 反序列化 JSON 数组

将c#集合序列化为视图中的jquery数组以通过ajax方法传递给控制器