You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:12:19