Fail to serialize IConfigurationSection from Json

rbr*_*r94 5 c# json.net

I have following Json-based configuration file:

{
  "PostProcessing": {
    "ValidationHandlerConfiguration": {
      "MinimumTrustLevel": 80,
      "MinimumMatchingTrustLevel": 75
    },
    "MatchingCharacterRemovals": [
      "-",
      "''",
      ":"
    ]
  },
  "Processing": {
    "OrderSelection": {
      "SelectionDaysInterval": 30,
      "SelectionDaysMaximum": 365
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

As serialization framework I use Newtonsoft. To serialize this config into objects I have implemented following classes:

[JsonObject(MemberSerialization.OptIn)]
public class RecognitionConfiguration {
    [JsonProperty(PropertyName = "PostProcessing", Required = Required.Always)]
    public PostRecognitionConfiguration PostRecognitionConfiguration { get; set; }

    [JsonProperty(PropertyName = "Processing", Required = Required.Always)]
    public ProcessRecognitionConfiguration ProcessRecognitionConfiguration { get; set; }
}

[JsonObject(MemberSerialization.OptIn)]
public class PostRecognitionConfiguration {
    [JsonProperty(Required = Required.Always)]
    public ValidationHandlerConfiguration ValidationHandlerConfiguration { get; set; }

    [JsonProperty] public List<string> MatchingCharacterRemovals { get; set; }
}

[JsonObject(MemberSerialization.OptIn)]
public class ProcessRecognitionConfiguration {
    [JsonProperty(PropertyName = "OrderSelection", Required = Required.Always)]
    public OrderSelectionConfiguration OrderSelectionConfiguration { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

In a class I try to serialize a specific configuration section into these class structures using IConfigurationSection.Get().

var serializedConfiguration = this.ConfigurationSection.Get<RecognitionConfiguration>();
Run Code Online (Sandbox Code Playgroud)

But when I debug the code, I always get an "empty" variable serializedConfiguration which is not null, but all properties are null.

在此处输入图片说明

If I use

this.ConfigurationSection.GetSection("Processing").Get<ProcessRecognitionConfiguration>()
Run Code Online (Sandbox Code Playgroud)

or change the naming of the properties in the json file to exactly match the property names in the classes like this:

{   
  "ProcessRecognitionConfiguration": {
    "OrderSelectionConfiguration": {
      "SelectionDaysInterval": 30,
      "SelectionDaysMaximum": 365
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

it it works fine. Do you have any idea, why setting PropertyName on JsonProperty does not seem to have any effect?

Nko*_*osi 4

这是设计使然。按照惯例,通过配置绑定到 POCO。不像模型绑定到控制器操作参数。

它将 POCO 上的属性名称与提供的 JSON 中的键进行匹配。

ASP.NET Core 中的参考配置

因此,要么更改设置以匹配原始问题中所示的类,要么更改类以匹配基于 Json 的配置文件中的设置键。

[JsonObject(MemberSerialization.OptIn)]
public class RecognitionConfiguration {
    [JsonProperty(PropertyName = "PostProcessing", Required = Required.Always)]
    public PostRecognitionConfiguration PostProcessing{ get; set; }

    [JsonProperty(PropertyName = "Processing", Required = Required.Always)]
    public ProcessRecognitionConfiguration Processing{ get; set; }
}

[JsonObject(MemberSerialization.OptIn)]
public class PostRecognitionConfiguration {
    [JsonProperty(Required = Required.Always)]
    public ValidationHandlerConfiguration ValidationHandlerConfiguration { get; set; }

    [JsonProperty] 
    public List<string> MatchingCharacterRemovals { get; set; }
}

[JsonObject(MemberSerialization.OptIn)]
public class ProcessRecognitionConfiguration {
    [JsonProperty(PropertyName = "OrderSelection", Required = Required.Always)]
    public OrderSelectionConfiguration OrderSelection { get; set; }
}

public partial class ValidationHandlerConfiguration {
    [JsonProperty("MinimumTrustLevel")]
    public long MinimumTrustLevel { get; set; }

    [JsonProperty("MinimumMatchingTrustLevel")]
    public long MinimumMatchingTrustLevel { get; set; }
}


public partial class OrderSelectionConfiguration {
    [JsonProperty("SelectionDaysInterval")]
    public long SelectionDaysInterval { get; set; }

    [JsonProperty("SelectionDaysMaximum")]
    public long SelectionDaysMaximum { get; set; }
}
Run Code Online (Sandbox Code Playgroud)