.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 更改属性名称的大小写,但不更改属性的名称