【问题标题】:How to get a JSON property name matching the naming strategy for a model?如何获取与模型命名策略匹配的 JSON 属性名称?
【发布时间】:2021-03-18 03:38:11
【问题描述】:

假设一个应用程序的序列化程序设置为CamelCasePropertyNamesContractResolver,而我有一个模型:

public class Model
{
    public int Id { get; set; }

    [JsonProperty(Name = "content_text")]
    public string Text { get; set; }
}

我想找到一种方法来获取序列化程序在序列化时为每个属性生成的结果名称,以便以下内容为真:

string JsonName<T>(string cSharpPropertyName)
{
    //
}

JsonName<Model>(nameof(Model.Id)) == "id";
JsonName<Model>(nameof(Model.Text)) == "content_text";

我正在为自定义类型编写自定义反序列化器(JSON 转换器),我想将我的 Model 属性与 JSON 输入匹配,但不区分大小写,但使用当前的序列化器策略。

我的想法是将包含在新 JSON 对象中的每个传入 JToken 反序列化为 c#object 并检查结果属性名称,但它似乎效率不高。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    您可以使用合同解析器本身来完成这项工作。

    让您的JsonName 方法接受IContractResolver 作为参数以及属性名称。实现可能如下所示:

    public static string JsonName<T>(string cSharpPropertyName, IContractResolver resolver) where T : class
    {
        var contract = resolver.ResolveContract(typeof(T)) as JsonObjectContract;
        var property = contract?.Properties.FirstOrDefault(p => p.UnderlyingName == cSharpPropertyName);
        return property?.PropertyName;
    }
    

    在您的JsonConverter 中,您可以从序列化程序中获取合约解析器,它作为参数提供给ReadJson

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var resolver = serializer.ContractResolver;
        ...
    }
    

    【讨论】:

    • 完美!谢谢!
    • 很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2021-02-02
    • 2011-11-08
    相关资源
    最近更新 更多