【问题标题】:Best way to allow for field name aliases in [JsonConstructor]?在 [JsonConstructor] 中允许字段名称别名的最佳方法?
【发布时间】:2020-04-09 23:49:11
【问题描述】:

我有一个类,其中包含一个名为“productName”的字段。我想允许该字段使用别名(“名称”)。

现在,我可以通过添加另一个字段和一些逻辑来做到这一点,但也许有更简洁的方法?

现在的构造函数是这样的:

  [JsonConstructor]
  public OsInfo(string name = null, string platform = null, string version = null) {

目标是接受这两个 JSON 块:

使用“名称”:

  'os': {
       'platform': 'Android-armv7-a',
       'name': 'Android',
       'version': 'Android 7.1.2'
   }

使用“产品名称”:

  'os': {
       'platform': 'Android-armv7-a',
       'productname': 'Android',
       'version': 'Android 7.1.2'
   }

我目前的解决方案是这样的,但我希望找到一种更简洁的方法:

    [JsonConstructor]
    public OsInfo(string name = null, string productname = null, string platform = null, string version = null)
    {
        if (name != null && productname != null)
        {
            throw new ArgumentException("Don't use both aliases for OS name");
        }

        this.Name = name != null ? name : productname;

【问题讨论】:

  • 可以将[JsonProperty("productName")]添加到构造函数参数name中,如this answerJson.net JsonConstructor constructor parameter names所示。
  • 不,这行不通。如果这样做,我会将“名称”替换为有效的字段名称,而不是为其添加别名。并且不能在同一个字段中添加两个 JsonProperty 注解。
  • 那么也许您可以多解释一下您要做什么。您是要重命名构造函数参数、重命名属性、将两个名称同时映射到构造函数参数,还是将两个名称同时映射到属性? minimal reproducible example 将大大有助于清除您的要求。
  • 您需要显示实际的 JSON、实际代码、您期望的内容以及您得到的内容,包括堆栈跟踪的所有异常。
  • @JonathanAlfaro 没有异常,也没有堆栈跟踪。我要做的就是允许人们使用(不推荐使用的)键作为值(“产品名称”)作为正确值(“名称”)的别名。由于没有运行代码,因此也没有“我期望什么和我得到什么”。这不是修复错误的尝试。这是尝试以最简洁的方式添加功能。

标签: c# json.net


【解决方案1】:

解决方案最终是在构造函数中完成。 cmets 中提到了一些替代方案,似乎它们可能更适合其他用例。

[JsonConstructor]
public OsInfo(string name = null, string productname = null, string platform = null, string version = null)
{
    if (name != null && productname != null)
    {
        throw new ArgumentException("Don't use both aliases for OS name");
    }

    this.Name = name != null ? name : productname;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多