前后端沟通 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()

 

 

posted @ 2021-06-12 18:39  兴杰  阅读(92)  评论(0编辑  收藏  举报