如何在 JSON.Net 中获取 JsonProperty 的名称

本文关键字:JsonProperty 获取 JSON Net | 更新日期: 2023-09-27 18:37:02

我有一个这样的类:

[JsonObject(MemberSerialization.OptIn)]
public class foo
{
     [JsonProperty("name_in_json")]
     public string Bar { get; set; }
     // etc. 
     public Dictionary<string, bool> ImageFlags { get; set; }
}

JSON 最初是从 CSV 文件生成的,每行代表一个 foo 对象 - 它基本上是平面的,所以我需要将某些键映射到 imageflags。

我尝试根据这里的例子编写一个CustomCreationConverter。

这似乎可以很好地映射标志,但它无法设置正常属性 - 它寻找"bar"而不是"name_in_json"。

我将如何获取 foo 类型的对象的"name_in_json"值?

编辑

当前解决方案:

 var custAttrs = objectType.GetProperties().Select(p =>     p.GetCustomAttributes(typeof(JsonPropertyAttribute), true)).ToArray();
 var propNames = objectType.GetProperties().Select(p => p.Name.ToLower()).ToArray();
 Dictionary<string, string> objProps = new Dictionary<string, string>();
 for (int i = 0; i < propNames.Length; i++) 
     // not every property has json equivalent...
     if (0 == custAttrs[i].Length)
     {
         continue;
     }
     var attr = custAttrs[i][0] as JsonPropertyAttribute; 
     objProps.Add(attr.PropertyName.ToLower(), propNames[i].ToLower());
 }

如何在 JSON.Net 中获取 JsonProperty 的名称

这是一个旧帖子,但我想建议稍微修改一下,我认为这更干净。(最近遇到了同样的问题)它使用匿名类型。

var pairs = objectType
    .GetProperties()
    .Select(p => new {
        Property = p,
        Attribute = p
            .GetCustomAttributes(
                typeof(JsonPropertyAttribute), true)
            .Cast<JsonPropertyAttribute>()
            .FirstOrDefault() });
var objProps = pairs
    .Where(p => p.Attribute != null)
    .ToDictionary(
        p => p.Property.Name,
        p => p.Attribute.PropertyName);

好的,在上面的示例中,您从以下类型中获取所有属性名称:

var objProps = objectType.GetProperties().Select(p => p.Name.ToLower()).ToArray();

因此,您只使用实际的属性名称,您应该做的是为每个属性获取 GetCustomAttributes 方法JsonProperty类型的自定义属性,并从中获取 json 属性名称。