1

私はJson.NETを使用しており、次のコードがあります。

public class Row
{
    [JsonProperty]
    public IDictionary<string, object> Cells { get; set; }
}

行とセルは動的に生成され、それらのセルを作成するためのC#動的/拡張機能がありました。Json.NETが動的インスタンスをシリアル化すると、必要な正しいjson構造が生成されます。ただし、大規模なデータ構造の場合、パフォーマンスに悪影響を及ぼします。たとえば、JsonSerializerは、シリアル化中にDynamicObjectTryGetMemberを非常に広範囲に呼び出します。したがって、シリアル化がはるかに高速になるように、静的データ構造が必要でした。シナミックExpandoオブジェクトは引き続き動的プロパティを作成しますが、Json.NETシリアル化で静的構造(動的構造に基づいて作成された)を使用して、シリアル化がはるかに高速になるようにしたかったのです。

セルディクショナリは動的構造に基づいて入力され、JsonConvertを呼び出すことにより、次のようにシリアル化されたjson構造を生成します。

 string serializeObject =  JsonConvert.SerializeObject(data, Formatting.Indented);

// json出力:

 {

    "Data": [
              {
                "Cells": {
                     "column1": "20",
                     "column2": "20"
                     }
              },
              {
                "Cells": {
                    "column1": "20",
                    "column2": "20"
                    }
              }
      ]
}

ただし、バインドしているUIグリッドには、以下のjson構造が必要です。

   "Data": [
               {
                     "column1": "20",
                     "column2": "20"                  
               },
               {                   
                    "column1": "20",
                    "column2": "20"                  
               }
           ]

「セル」を削除して、上記のようにJson構造を生成する方法はありますか?

JSON.NETヘルプドコを調べましたが、これを実現する方法が見つかりませんでした。また、DynamicContractResolverのCreatePropertyメソッドをオーバーライドして、シリアル化の動作を変更できるかどうかを確認しようとしましたが、変更できませんでした

 public class DynamicContractResolver : DefaultContractResolver
 {       
    protected override JsonProperty CreateProperty(System.Reflection.MemberInfo member, MemberSerialization memberSerialization)
    {
        if (member.Name == "Cells")
        {
             //remove the name "Cells" from the serialized structure    
        }
        return base.CreateProperty(member, memberSerialization);
    }
 }

または、これは単にサポートされていませんか?どんな提案や指示も大歓迎です。

4

1 に答える 1

5

カスタムコンバーターを作成することにより、これを回避する方法を見つけました。以下のコードは、私が必要とするJsonの結果を生成します。

public class GridJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true; //TODO: more logic check the type before the conversion..
    }

    public override void WriteJson(JsonWriter writer, 
       object value, JsonSerializer serializer)
    {
        var rows = (List<Row>)value;

        writer.WriteStartObject();
            writer.WritePropertyName("data");
                writer.WriteStartArray();

        foreach (var row in rows)
        {
            writer.WriteStartObject();
            var cells = row.Cells;

            foreach (var cell in cells)
            {
                writer.WritePropertyName(cell.Key);
                writer.WriteValue(cell.Value);    
            }

            writer.WriteEndObject();
        }

        writer.Flush();
    }

    public override object ReadJson(JsonReader reader, Type objectType, 
       object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

//使用例:

  string serializeObject = JsonConvert.SerializeObject
 (someData, Formatting.Indented,   new GridJsonConverter());
于 2012-08-26T10:04:08.463 に答える