如何获取JSON属性名称

aor9mmx1  于 2023-01-10  发布在  其他
关注(0)|答案(3)|浏览(458)

我有一个类如下:

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”。我如何修改上面的代码来实现这一点?

yruzcnhs

yruzcnhs1#

要在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 =新人{姓名=“约翰·史密斯”,年龄= 30,城市=“纽约”};

foreach (var property in person.GetType().GetProperties())
{

  var jsonPropertyAttribute = property.GetCustomAttribute<JsonPropertyAttribute>();
  if (jsonPropertyAttribute != null)
  {
    string propertyName = jsonPropertyAttribute.PropertyName;
  }
}
9ceoxa92

9ceoxa922#

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

.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
})

还要注意,如果对象只包含string,则可以直接反序列化为Dictionary<string, string>

wfsdck30

wfsdck303#

我猜这和这个帖子中暴露的问题很相似:How to get Json Property name using reflection in C#
如果不强制要求您使用反射访问对象,您可以将Json反序列化为Dictionary〈string,string〉,如下所示:

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

然后使用values.Keys从其中获取键。希望这能有所帮助

相关问题