我有一个这样的课:
[JsonObject(MemberSerialization.OptIn)]
public class foo
{
[JsonProperty("name_in_json")]
public string Bar { get; set; }
// etc.
public Dictionary<string, bool> ImageFlags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
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());
}
Run Code Online (Sandbox Code Playgroud)
这是一个旧帖子,但我想建议稍微修改一下,我认为它更清晰。(最近遇到了同样的问题)它使用匿名类型。
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);
Run Code Online (Sandbox Code Playgroud)
好的,在上面的示例中,您从 type 中获取所有属性名称:
var objProps = objectType.GetProperties().Select(p => p.Name.ToLower()).ToArray();
Run Code Online (Sandbox Code Playgroud)
所以你只使用实际的属性名称,你应该做的是为每个属性JsonProperty使用GetCustomAttributes方法获取类型的自定义属性,并从中获取 json 属性名称。
| 归档时间: |
|
| 查看次数: |
7106 次 |
| 最近记录: |