2015-12-03 11 views
17

Używam json.net (Newton's JsonSerializer). Potrzebuję dostosować serializację, aby spełnić następujące wymagania:NewtonSoft JsonSerializer - Właściwości i słownik małych liter

  1. nazwy właściwości muszą zaczynać się od małej litery.
  2. Słownik musi być serializowany do jsonp, gdzie klucze będą używane dla nazw właściwości. Reguła LowerCase nie dotyczy kluczy słownika.

na przykład:

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

musi serializacji do:

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

uprzedzenia że właściwość Name serializes do "nazwa", ale klucz Pozycja1 serializes do słowa "Item1";

Próbowałem stworzyć CustomJsonWriter do serializacji nazw właściwości, ale zmienia się również klucze diction.

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

Odpowiedz

9

Możesz użyć JsonProperty, aby zmienić sposób serializacji/deserializacji. Po zdefiniowaniu obiektu dodaj elementy właściwości do pól, które mają być reprezentowane inaczej w JSON. Działa to tylko z NewtonsoftJSON. Inne biblioteki mogą robić to inaczej.

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

To nie jest naruszenie. Zapewnia mapowanie, które może być konieczne w przypadku serializacji danych. Wynika to z niedopasowania nazw zmiennych C# i bazowego formatu serializacji - nie ograniczając się do JSON. – Metro

+1

cóż, jeśli istnieje reguła lub konwencja, która może być użyta do określenia odwzorowania, to jest to naruszenie DRY – Liero

+0

Zasada DRY jest określona jako "Każda wiedza musi mieć pojedynczą, jednoznaczną, autorytatywną reprezentację w systemie. dowolnego pojedynczego elementu systemu nie wymaga zmiany w innych logicznie niezależnych elementach, a ponadto elementy, które są logicznie powiązane, zmieniają się w sposób przewidywalny i jednolity, a zatem są zsynchronizowane. " – Liero

37

Możesz spróbować użyć CamelCasePropertyNamesContractResolver.

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

Po prostu nie jestem pewien, jak będzie obsługiwać klawisze słownika i nie mam czasu w tej chwili, aby spróbować. Jeśli nie obsługuje poprawnie kluczy, warto pamiętać o przyszłości, zamiast pisać własnego niestandardowego pisarza JSON.

+0

Należy zachować ostrożność przy tej opcji. Ta opcja powoduje również obniżenie kluczy w serializowanych słownikach. Zwykle nie jest to pożądane. – user1936595

Powiązane problemy