2015-12-03 1 views
17

Ich benutze json.net (Newtonsoft JsonSerializer). Ich muss die Serialisierung anpassen, um die folgenden Anforderungen zu erfüllen:Newtonsoft JsonSerializer - Kleinbuchstaben Eigenschaften und Wörterbuch

  1. Eigenschaftsnamen müssen mit Kleinbuchstaben beginnen.
  2. Dictionary muss in jsonp serialisiert werden, wobei Schlüssel für Eigenschaftsnamen verwendet werden. Die LowerCase-Regel gilt nicht für Wörterbuchschlüssel.

zum Beispiel:

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

muss in serialisiert:

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

Hinweis, dass eine Immobilie in "name" serialisiert, aber Schlüssel element1 serialisiert in "Element1";

Ich habe versucht, CustomJsonWriter zu erstellen, um Eigenschaftsnamen zu serialisieren, aber es ändert auch dicionary Schlüssel.

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); 
    } 
} 

Antwort

9

Sie können eine JsonProperty verwenden, um zu ändern, wie etwas serialisiert/deserialisiert wird. Wenn Sie Ihr Objekt definieren, fügen Sie die Eigenschaftenelemente zu den Feldern hinzu, die in JSON anders dargestellt werden sollen. Dies funktioniert nur mit NewtonsoftJSON. Andere Bibliotheken können das anders machen.

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

Dies ist keine Verletzung. Es bietet eine Zuordnung, die bei der Datenserialisierung erforderlich sein kann. Dies liegt an der Nichtübereinstimmung zwischen C# -Variablennamen und dem zugrundeliegenden Serialisierungsformat - nicht beschränkt auf JSON. – Metro

+1

Nun, wenn es eine Regel oder Konvention gibt, die verwendet werden kann, um das Mapping zu bestimmen, dann ist es eine Verletzung von DRY – Liero

+0

Das DRY-Prinzip wird wie folgt festgelegt: "Jedes Wissen muss eine einzige, unzweideutige, autoritative Repräsentation in einem System haben von jedem einzelnen Element eines Systems erfordert keine Änderung in anderen logisch nicht verwandten Elementen. Darüber hinaus ändern sich Elemente, die logisch miteinander verwandt sind, vorhersagbar und einheitlich und werden somit synchron gehalten. " – Liero

37

Sie könnten versuchen, die CamelCasePropertyNamesContractResolver verwenden.

Ich bin mir einfach nicht sicher, wie es mit den Wörterbuchschlüsseln umgehen soll und ich habe keine Zeit, diese Sekunde zu versuchen. Wenn es die Schlüssel nicht korrekt behandelt, lohnt es sich, es für die Zukunft zu behalten, anstatt einen eigenen benutzerdefinierten JSON-Schreiber zu schreiben.

+0

Seien Sie vorsichtig mit dieser Option. Diese Option führt auch zu kleineren Schlüsseln der serialisierten Wörterbücher. Dies ist normalerweise nicht das, was gewünscht wird. – user1936595