.NET 6 - 更改 Json 属性外壳

Posted

技术标签:

【中文标题】.NET 6 - 更改 Json 属性外壳【英文标题】:.NET 6 - Change Json Property Casing 【发布时间】:2022-01-11 12:08:22 【问题描述】:

如何在不执行模型绑定的情况下更改 json 属性名称的大小写? JsonElement 序列化忽略 PropertyNaming JsonSerializer 选项,这里也确认:https://github.com/dotnet/runtime/issues/61843 建议使用 JsonNode/JsonObject 会导致相同的行为。

任何提示我可以如何做到这一点?

例如,我想改变这个:


    "MyPoperty" : 5,
    "MyComplexProperty" : 
        "MyOtherProperty": "value",
        "MyThirdProperty": true
    

到这里:


    "myPoperty" : 5,
    "myComplexProperty" : 
        "myOtherProperty": "value",
        "myThirdProperty": true
    

干杯。

【问题讨论】:

好像你的问题在这里已经有了答案:***.com/questions/58570189/… 否 - 该解决方案需要模型绑定。序列化 JsonElements 时,序列化不考虑命名策略或自定义转换器。 【参考方案1】:

我认为你尝试使用Newtonsoft json

class Person

    public string UserName  get; set; 
    public int Age  get; set; 

编码

static void Main(string[] args)

    Person person = new Person();
    person.UserName = "Bob";
    person.Age = 20;

    var serializerSettings = new JsonSerializerSettings();
    serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    var json = JsonConvert.SerializeObject(person, serializerSettings);
    Console.WriteLine(json);

输出

"userName":"Bob","age":20

【讨论】:

有没有办法用新的 System.Text.Json 代替? 除此之外没有更好的解决方案了。 对了,我需要一个没有模型绑定的解决方案。通过模型绑定,它可以在 NewtonSoft 和 System.Text.Json 中使用。 我尝试使用NewtonSoft直接解析字符。 或许还有办法实现,但比较麻烦【参考方案2】:

不依赖于Newtonsoft json ,而是在多层对象的情况下

var json = @"""ShouldWindUpAsCamelCase"":""does it?""";
var obj = JsonSerializer.Deserialize<Dictionary<string,string>>(json);
var dic = new Dictionary<string, string>();
foreach (var item in obj)

    dic.Add(item.Key.FirstCharToLower(), item.Value);

var serialized = System.Text.Json.JsonSerializer.Serialize(dic);
Console.WriteLine(serialized);

FirstCharToLower() 函数

 public static string FirstCharToLower(this string input)
        
            if (String.IsNullOrEmpty(input))
                return input;
            string str = input.First().ToString().ToLower() + input.Substring(1);
            return str;
        

#输出

"shouldWindUpAsCamelCase":"does it?"

【讨论】:

感谢您的建议,但这也行不通。这基本上绑定到平面字典。所以它不允许复杂的对象。毕竟我确实找到了解决方案,但它远非理想:***.com/questions/57263017/… - 使用 newtonsoft 和 expandoObject。 好吧,让我尝试更多的方法,我会告诉你的

以上是关于.NET 6 - 更改 Json 属性外壳的主要内容,如果未能解决你的问题,请参考以下文章

IEnumerable 在 Json.NET 中序列化为 [JsonObject],不使用属性

JsonSerializerSettings 更改属性名称的大小写,但不更改属性的名称

Attribute Changer(更改各种文件属性) 7.1a 汉化安装版

EF6 设置默认属性禁用更改跟踪

在 C# 中访问媒体文件的外壳属性“长度”(又名持续时间)

APS.NET Core- launchSettings.json