12

我有这样的课:

[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());
 }
4

2 回答 2

8

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

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);
于 2018-06-20T17:15:06.460 回答
5

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

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

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

于 2012-06-12T06:38:09.323 回答