如何在HotChocolate GraphQL中输出属性有序的规范JSON?
解决HotChocolate中返回JSON属性固定顺序的问题
因为HotChocolate使用System.Text.Json进行序列化,要让返回的JSON属性保持指定顺序,有两种常用方式:
方法一:给类属性添加特性(推荐)
直接在SignedOutput类的属性上标记JsonPropertyOrder来指定序列化顺序,同时用JsonPropertyName确保JSON键名符合要求:
using System.Text.Json.Serialization; public class SignedOutput { [JsonPropertyName("deviceId")] [JsonPropertyOrder(0)] // 数字越小,序列化时越靠前 public string DeviceId { get; set; } [JsonPropertyName("terminalId")] [JsonPropertyOrder(1)] public string TerminalId { get; set; } }
这样不管C#类里属性的定义顺序怎么调整,序列化后的JSON都会严格按照JsonPropertyOrder指定的顺序输出,同时键名也会转换成示例中的小写驼峰格式。
方法二:全局配置System.Text.Json序列化选项
如果需要对所有类型统一配置序列化规则,可以在注册HotChocolate服务时,自定义JsonSerializerOptions:
builder.Services.AddGraphQLServer() .AddQueryType<Query>() .AddMutationType<Mutation>() .ModifyJsonOptions(options => { // 全局设置驼峰命名(可选,和上面的JsonPropertyName二选一即可) options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 确保序列化时遵循JsonPropertyOrder的配置 options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; });
注意:如果已经给属性单独标记了JsonPropertyName,全局的PropertyNamingPolicy不会覆盖该属性的自定义名称。
这样配置后,你的SignRequest方法不需要做任何修改,返回的SignedOutput对象序列化后就会保持你需要的属性顺序。
内容的提问来源于stack exchange,提问作者Navorski
相关产品推荐
相关产品推荐

