如何让JsonNode.ToJsonString(...)生成按字母序排列的属性?
如何让JsonNode.ToJsonString()生成按字母序排列的属性?
在单元测试里用JsonNode.ToJsonString(...)序列化时,会碰到属性顺序完全由子节点/值节点的运行时添加顺序决定的问题,但单元测试需要固定的属性顺序来匹配预期结果。查阅JsonSerializerOptions相关文档后找不到对应配置项,下面提供可行的解决办法:
解决方案:手动排序JsonObject属性后再序列化
JsonObject本质是键值对集合,默认按插入顺序存储属性。要生成按字母序排列的JSON字符串,需要先将JsonObject的属性按键排序,再创建新的JsonObject实例执行序列化。
示例代码
可以封装一个扩展方法实现通用的排序序列化逻辑:
using System.Text.Json.Nodes; using System.Linq; using System.Collections.Generic; public static class JsonNodeExtensions { public static string ToSortedJsonString(this JsonNode node, JsonSerializerOptions? options = null) { return ProcessNode(node).ToJsonString(options); } private static JsonNode ProcessNode(JsonNode node) { switch (node) { case JsonObject obj: // 按键的字母序排序,生成新的JsonObject var sortedObj = new JsonObject( obj.OrderBy(kv => kv.Key, StringComparer.OrdinalIgnoreCase) ); // 递归处理嵌套节点 foreach (var kv in sortedObj.ToList()) { sortedObj[kv.Key] = ProcessNode(kv.Value); } return sortedObj; case JsonArray array: // 递归处理数组内的每个元素 var sortedArray = new JsonArray( array.Select(ProcessNode) ); return sortedArray; default: // 值类型节点直接返回 return node; } } }
使用方式
在单元测试中直接调用这个扩展方法即可:
var jsonNode = ...; // 你的JsonNode实例 var sortedJson = jsonNode.ToSortedJsonString(); // 用sortedJson和预期结果做断言对比
补充说明
- 排序时可根据需求切换
StringComparer.Ordinal(大小写敏感)或OrdinalIgnoreCase(大小写不敏感); - 如果你的
JsonNode是从.NET对象序列化而来,仅靠JsonSerializerOptions无法控制动态节点的属性顺序,仍需使用上述排序方法。
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

