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を書いてみました。

これはフラグをうまくマップしているように見えますが、通常のプロパティの設定に失敗します-「name_in_json」の代わりに「bar」を探します。

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

さて、上記の例では、次のタイプからすべてのプロパティ名を取得します。

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

したがって、実際のプロパティ名のみを使用します。代わりに、各プロパティに対してGetCustomAttributesJsonPropertyメソッドを使用してタイプのカスタム属性を取得し、そこからjsonプロパティ名を取得する必要があります。

于 2012-06-12T06:38:09.323 に答える