2015-12-03 13 views
17

私はjson.net(NewtonsoftのJsonSerializer)を使用しています。次の要件を満たすためにシリアル化をカスタマイズする必要があります。Newtonsoft JsonSerializer - 小文字のプロパティと辞書

  1. プロパティ名は小文字で始まる必要があります。
  2. 辞書は、プロパティ名にキーが使用されるjsonpにシリアル化する必要があります。 LowerCaseルールは辞書キーには適用されません。例えば

var product = new Product(); 
procuct.Name = "Product1"; 
product.Items = new Dictionary<string, Item>(); 
product.Items.Add("Item1", new Item { Description="Lorem Ipsum" }); 

がにシリアライズする必要があります。プロパティ名が "名前" にシリアライズしますが、キーアイテム1は、 "アイテム1" にシリアライズすること

{ 
    name: "Product1", 
    items : { 
    "Item1": { 
     description : "Lorem Ipsum" 
    } 
    } 
} 

予告。

私はプロパティ名をシリアル化するためにCustomJsonWriterを作成しようとしましたが、それはまた、大胆なキーを変更します。

public class CustomJsonWriter : JsonTextWriter 
{ 
    public CustomJsonWriter(TextWriter writer) : base(writer) 
    { 

    } 
    public override void WritePropertyName(string name, bool escape) 
    { 
     if (name != "$type") 
     { 
      name = name.ToCamelCase(); 
     } 
     base.WritePropertyName(name, escape); 
    } 
} 

答えて

9

JsonPropertyを使用すると、何かがシリアル化/逆シリアル化される方法を変更できます。オブジェクトを定義するときは、JSONで異なる表現をしたいフィールドにプロパティ項目を追加します。これはNewtonsoftJSONでのみ動作します。他のライブラリはそれを別々に行うかもしれません。

public class Product 
{ 
    [JsonProperty("name")] 
    public string Name { get; set; } 

    [JsonProperty("items")] 
    public Dictionary<string, Item> Items { get; set; } 
} 

public class Item 
{ 
    [JsonProperty("description")] 
    public string Description { get; set; } 
} 
+5

これは違反ではありません。これは、データの直列化を扱うときに必要なマッピングを提供します。これは、C#の変数名とJSONに限定されない基になるシリアル化形式の不一致が原因です。 – Metro

+1

マッピングを決定するために使用できる規則や規則がある場合、DRY – Liero

+0

に違反しています。DRYの原則は、「すべての知識は、システム内で単一で明白で信頼できる表現でなければなりません。論理的に関連している要素はすべて予測可能かつ一様に変化し、したがって同期している」と述べている。 – Liero

37

CamelCasePropertyNamesContractResolverを試してみることもできます。

var serializerSettings = new JsonSerializerSettings(); 
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
var json = JsonConvert.SerializeObject(product, serializerSettings); 

私はちょうどそれが辞書のキーを処理しますし、私はそれをしようとする権利この第二の時間を持っていないかどうかはわかりません。キーを正しく処理できない場合は、独自のカスタムJSONライターを作成するのではなく、将来のために留意する価値があります。

+0

このオプションには注意してください。このオプションを使用すると、シリアライズされたディクショナリのキーも小さくなります。これは、通常、望ましいものではありません。 – user1936595

関連する問題