前后端沟通 naming conversion 转换需要知道的事
c# 是 pascal case, js 是 camel case 所以在做 web api 和 odata 的时候经常需要转换.
早年 web api 是依赖 Newtonsoft json (JSON.NET) 的, 所以我们常看见
[JsonProperty(propertyName: "name_cn")] public string Name { get; set; } = "";
或者
[DataMember(Name = "name_cn")] public string Name { get; set; } = "";
2 个都可以用, data member 是微软自己的, 好像是 wcf 带下来的. JsonProperty 是 newton 的.
而 newton 也会去读 data member 所以就通用了.
后来微软不依赖 newton 了, 改成了 System.Text.Json
就用了后来的
[JsonPropertyName("name_cn")] public string Name { get; set; } = "";
所以现在的话,应该是用 JsonPropertyName 就对了
一般的 pascal case to camel case 什么都不需要设置, 默认就可以了
frombody, fromform 都是 ok 的.
https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-customize-properties
那么 odata 从来就不是用 newton 的, 所以不支持 JsonProperty
现在呢, 它视乎也没有要支持 System.Text.Json, 所以也是不可以用 JsonPropertyName
有个 feature request : https://github.com/OData/WebApi/issues/2174
那么, odata 可以 2 种做法.
第一种就是用 DataMember, 这个是微软的嘛, 而已 odata 和 wcf 靠很近.
https://docs.microsoft.com/en-us/odata/webapi/convention-model-builder
注 : 要写全套哦, DataContract, DataMember, Key 都要
[DataContract] public class Product { [DataMember] [Key] public int Id { get; set; } [DataMember(Name = "name_cn")] public string Name { get; set; } = ""; [DataMember] public ProductStatus Status { get; set; } }
之前我也遇过一个 enum to string 的问题.
https://github.com/OData/WebApi/issues/2264
EnumMember 和 DataContract 也是一类的, 那时候也是一定要写 DataContract 才有用.
第二种就是在 builder 的时候直接改.
https://stackoverflow.com/questions/42016069/how-to-query-odata-while-using-alternate-property-names
如果你 2 个都写的话, builder 会盖过 data member 哦
一般的 pascal case to camel case
https://stackoverflow.com/questions/24909532/odata-json-camelcase
builder.EnableLowerCamelCase()