C#中将指定结构的JSON对象转换为JSON数组的最优方法
嘿,这个转换需求其实挺常见的,用C#里的主流JSON处理库就能高效搞定。下面给你两种最常用的方案,分别适配不同的项目场景:
使用 System.Text.Json(官方内置,推荐新项目)
如果你的项目基于 .NET Core 3.0+ 或者 .NET 5+,优先用这个方案——它是微软官方内置的JSON库,无需额外安装NuGet包,性能优异,还能和现代.NET生态完美兼容。
步骤实现:
- 先定义目标数据类型(让结构更清晰,维护性更强):
using System.Text.Json.Serialization; public class TargetItem { [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("id")] public int Id { get; set; } [JsonPropertyName("last")] public string Last { get; set; } }
这里的JsonPropertyName属性是为了确保序列化后的JSON键是小写的name/id/last,和你要的结果完全匹配。
- 编写转换逻辑:
using System.Text.Json; using System.Linq; // 原始JSON字符串 string originalJson = @"{""Data1"": {""id"":1, ""last"":""0.00000045""}, ""Data2"": {""id"":2, ""last"": ""0.02351880""}}"; // 1. 把原始JSON反序列化为字典:键是Data1/Data2,值是对应的JSON元素 var dataDict = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(originalJson); // 2. 遍历字典,构造目标数组 var targetArray = dataDict.Select(kv => new TargetItem { Name = kv.Key, Id = kv.Value.GetProperty("id").GetInt32(), Last = kv.Value.GetProperty("last").GetString() }).ToArray(); // 3. 序列化为最终的JSON数组字符串 string resultJson = JsonSerializer.Serialize(targetArray, new JsonSerializerOptions { WriteIndented = true }); // 输出结果 Console.WriteLine(resultJson);
如果只是简单场景不想定义类,也可以用匿名类型简化:
var targetArray = dataDict.Select(kv => new { name = kv.Key, id = kv.Value.GetProperty("id").GetInt32(), last = kv.Value.GetProperty("last").GetString() }).ToArray();
使用 Newtonsoft.Json(Json.NET,兼容性优先)
如果你的项目是老版本.NET Framework,或者已经在使用Newtonsoft.Json,那这个方案会更顺手——它的API更丰富,兼容性极强,是多年来的行业标准。
步骤实现:
- 先定义目标数据类型(同样用特性指定JSON键名):
using Newtonsoft.Json; public class TargetItem { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("id")] public int Id { get; set; } [JsonProperty("last")] public string Last { get; set; } }
- 编写转换逻辑:
using Newtonsoft.Json.Linq; using System.Linq; string originalJson = @"{""Data1"": {""id"":1, ""last"":""0.00000045""}, ""Data2"": {""id"":2, ""last"": ""0.02351880""}}"; // 1. 解析原始JSON为JObject var jObject = JObject.Parse(originalJson); // 2. 遍历JObject的所有属性,构造目标数组 var targetArray = jObject.Properties().Select(prop => new TargetItem { Name = prop.Name, Id = prop.Value["id"].Value<int>(), Last = prop.Value["last"].Value<string>() }).ToArray(); // 3. 序列化为最终的JSON数组字符串 string resultJson = JsonConvert.SerializeObject(targetArray, Formatting.Indented); Console.WriteLine(resultJson);
方案选择建议
- 新项目/现代.NET环境:选System.Text.Json,无依赖、性能好;
- 老项目/已有Newtonsoft依赖:选Newtonsoft.Json,API熟悉、兼容性拉满。
这两种方案都是非常高效的实现,时间复杂度都是O(n)(n是原始JSON里的键值对数量),完全能满足常规场景的性能需求。
内容的提问来源于stack exchange,提问作者iziz1
相关产品推荐
相关产品推荐

