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<List<object>>
,试试这个示例。这是List<string>
的列表。
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 数组反序列化为协变 List<>