【问题标题】:how to get json property name如何获取json属性名
【发布时间】:2023-01-06 23:28:14
【问题描述】:

我有一个类如下:

public class Client {
    [JsonProperty("first_name")]
    public string FirstName { get; set; }
    [JsonProperty("last_name")]
    public string LastName { get; set; }
}

使用以下代码,我可以在该类对象的字典中获取属性和值:

var propertyValuesByName = client.GetType().GetProperties()
        .Where(pi => pi.PropertyType == typeof(string))         
        .Select(pi => new { Val = (string) pi.GetValue(client), Name = pi.Name })
        .ToDictionary(pi => pi.Name, pi => pi.Val);

因此字典包含属性名称作为键,属性值作为值。但我想要的是,获取字典,其中键将是对象 JsonProperty 名称而不是真正的属性名称,这意味着我想要“first_name”作为键而不是“FirstName”。我怎样才能修改上面的代码来实现这一点?

【问题讨论】:

  • 您可以在此处添加示例 JSON 吗?

标签: c# json asp.net-core json.net


【解决方案1】:

使用更多反射从自定义属性中获取信息:

.Select(pi => new 
{ 
    Val = (string) pi.GetValue(client), 
    Name = pi.GetCustomAttribute<JsonPropertyAttribute>()?.PropertyName ?? pi.Name
})

或者 :

.Select(pi => new 
{ 
    Val = (string) pi.GetValue(client), 
    Name = (pi.GetCustomAttribute(typeof(JsonPropertyAttribute)) as JsonPropertyAttribute)?.PropertyName ?? pi.Name
})

另请注意,如果您的对象仅包含字符串,您可以直接反序列化为 Dictionary&lt;string, string&gt;

【讨论】:

  • 有效。感谢您的回答,关于您的建议,我不能只反序列化对象,因为我也想删除 null 属性。
【解决方案2】:

我想这类似于此线程中暴露的问题: How to get Json Property name using reflection in C#

如果使用反射访问对象不是强制性的,您可以像这样将 Json 反序列化为 Dictionary<string,string> :

var values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

然后使用 values.Keys 从中获取密钥。 希望这可以帮助

【讨论】:

    【解决方案3】:

    要在 C# 中获取 JSON 对象的属性名称,可以使用 nameof 运算符。例如,给定以下 JSON 对象:

    {
      "name": "John Smith",
      "age": 30,
      "city": "New York"
    }
    

    您可以使用 nameof 运算符来获取属性名称,如下所示:

    string name = nameof(jsonObject.name);  // "name"
    string age = nameof(jsonObject.age);   // "age"
    string city = nameof(jsonObject.city); // "city"
    

    请注意,nameof 运算符仅适用于编译时常量,因此它不适用于动态生成的属性名称。

    或者,您可以使用 JsonPropertyAttribute 在 JSON 对象中指定属性名称。例如: 公开课人

    {
      [JsonProperty("name")]
      public string Name { get; set; }
    
      [JsonProperty("age")]
      public int Age { get; set; }
    
      [JsonProperty("city")]
      public string City { get; set; }
    }
    

    然后您可以使用反射来获取属性名称,如下所示: var person = new Person { Name = "John Smith", Age = 30, City = "New York" };

    foreach (var property in person.GetType().GetProperties())
    {
    
      var jsonPropertyAttribute = property.GetCustomAttribute<JsonPropertyAttribute>();
      if (jsonPropertyAttribute != null)
      {
        string propertyName = jsonPropertyAttribute.PropertyName;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2021-12-13
      相关资源
      最近更新 更多