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

时间:2012-06-12 06:31:49

标签: c# json.net

我有一个类似的课程:

[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。

我尝试根据示例here编写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());
 }

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

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

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);