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

     2023-05-07     42

关键词:

【中文标题】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:deserializenestedarraysintostronglytypedobject【发布时间】:2012-10-1514:13:22【问题描述】:我正在编写客户端应用程序,它应该处理服务器响应。响应采用JSON格式。我决... 查看详情

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

】如何使用kotlinx序列化将值数组反序列化为集合【英文标题】:Howtodeserializeanarrayofvaluesintoacollectionusingkotlinxserialization【发布时间】:2021-03-2517:14:15【问题描述】:您好,我是kotlinx序列化的新手,我正在使用KMP,我的要求有点... 查看详情

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

】使用Json.NET将异构JSON数组反序列化为协变List<>【英文标题】:DeserializingheterogenousJSONarrayintocovariantList<>usingJson.NET【发布时间】:2012-01-0416:45:07【问题描述】:我有一个JSON数组,其中包含具有不同属性的不同类型的对... 查看详情

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

】使用JSON.NET一次序列化一组对象【英文标题】:SerializinganarrayofobjectsoneatatimewithJSON.NET【发布时间】:2014-08-1023:44:08【问题描述】:我尝试将多个项目序列化为json,并将它们格式化为数组。它是基于事件的,因为它有很多数据... 查看详情

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

】将c#集合序列化为视图中的jquery数组以通过ajax方法传递给控制器【英文标题】:Serializingc#collectiontojqueryarrayintheviewtopassthroughtheajaxmethodtocontroller【发布时间】:2021-04-0714:24:44【问题描述】:我有嵌套集合的视图模型。我想通过a... 查看详情

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

】使用来自URL的JSON.NET反序列化JSON数组【英文标题】:DeserializeJSONArraywithJSON.NETfromURL【发布时间】:2016-10-0622:42:45【问题描述】:我是第一次使用json,在互联网上搜索后,我找到了JSON.NET。我认为它很容易使用,但我有一个问题... 查看详情

使用 Json.Net 转换为 XML 时如何序列化空数组

...换为XML,但是当我这样做时,它会删除所有空数组/列表/集合/等...如何让它将数组包含为空项?示例Json:"EmptyCollection":[],"OtherPorper 查看详情

使用变量名数组反序列化 JSON

】使用变量名数组反序列化JSON【英文标题】:DeserializeJSONwithvariablenamearrays【发布时间】:2015-03-1803:02:58【问题描述】:我正在获取从RESTWeb服务返回的JSON以用于调查响应。它具有一些名称值对的名称部分的数组。此外,名称将... 查看详情

JSON.NET 用空字符串序列化数组作为默认值

】JSON.NET用空字符串序列化数组作为默认值【英文标题】:JSON.NETserializearraywithemptystringfordefaultvalues【发布时间】:2019-10-2917:40:33【问题描述】:这样的数组:vararr=newobject[]0,string.Empty,null;由JSON.NET序列化为:[0,"",null]我需要强制JS... 查看详情

Newsoft JSON .NET 反序列化为 VB.net 中具有私有属性的对象

】NewsoftJSON.NET反序列化为VB.net中具有私有属性的对象【英文标题】:NewsoftJSON.NETDeserializingtoanObjectwithPrivatePropertiesinVB.net【发布时间】:2017-03-0215:14:33【问题描述】:我目前正在编写一个API,它从使用NewsoftJSON.NET库在VB.net中处理... 查看详情

一次反序列化json数组流一项

】一次反序列化json数组流一项【英文标题】:Deserializejsonarraystreamoneitematatime【发布时间】:2013-12-2020:43:51【问题描述】:我将一个大对象数组序列化为一个jsonhttp响应流。现在我想一次一个地从流中反序列化这些对象。是否有... 查看详情

使用 Json.net 将 JSON 对象反序列化为动态对象

】使用Json.net将JSON对象反序列化为动态对象【英文标题】:DeserializeJSONobjectintodynamicobjectusingJson.net【发布时间】:2011-05-3023:13:12【问题描述】:是否可以使用json.net从json反序列化返回动态对象?我想做这样的事情:dynamicjsonRespons... 查看详情

如何使用 Json.NET 将 XML 序列化为 JSON 对象

】如何使用Json.NET将XML序列化为JSON对象【英文标题】:HowtoSerializeXMLtoaJSONobjectwithJson.NET【发布时间】:2011-10-1506:11:59【问题描述】:我可以像这样将XML序列化为JSON字符串:varxml=newXmlDocument();xml.LoadXml("<person><name>John</na... 查看详情

将 JSON 反序列化为 C# 类,其中 JSON 中的属性名称是动态的

】将JSON反序列化为C#类,其中JSON中的属性名称是动态的【英文标题】:DeserializingJSONtoC#classwherepropertynamesintheJSONaredynamic【发布时间】:2021-11-0606:49:40【问题描述】:我正在使用JSON.NET包来反序列化对C#类的JSON响应,但json的格式... 查看详情

如何将向量序列化为字符数组

】如何将向量序列化为字符数组【英文标题】:Howtoserializeavectorintoanarrayofchars【发布时间】:2016-04-0910:55:08【问题描述】:我有一个向量定义为:std::vector<message*>消息在哪里:structmessagestaticunsignedintlast_id;unsignedintid;std::string... 查看详情

如何将列表序列化为字符数组

】如何将列表序列化为字符数组【英文标题】:Howtoserializealistintoanarrayofchars【发布时间】:2016-04-1220:38:28【问题描述】:我有一个列表定义为:list<Message*>g_messages;Message是:structMessagestaticunsignedints_last_id;stringuser_name;stringcont... 查看详情

Json.net 将数字属性序列化为字符串

】Json.net将数字属性序列化为字符串【英文标题】:Json.netserializenumericpropertiesasstring【发布时间】:2017-01-2408:41:39【问题描述】:我正在使用JsonConvert.SerializeObject序列化模型对象。服务器期望所有字段都是字符串。我的模型对象... 查看详情

如何将重复的 XML 元素序列化为数组?

】如何将重复的XML元素序列化为数组?【英文标题】:HowtoserializeduplicateXMLelementsintoanarray?【发布时间】:2021-11-1316:31:49【问题描述】:我正在尝试序列化一些格式不正确的XML。我特别在将重复元素转换为数组时遇到问题。在通... 查看详情