2015-12-03 26 views
17

json.net (Newtonsoft'un JsonSerializer) yazılımını kullanıyorum. Aşağıdaki gereksinimleri karşılamak için serileştirmeyi özelleştirmem gerekiyor:Newtonsoft JsonSerializer - Küçük harf kullanımı ve sözlükler

  1. Özellik adları küçük harfle başlamalıdır.
  2. Sözlük, mülk adları için anahtarların kullanılacağı jsonp içine serileştirilmelidir. LowerCase kuralı, sözlük tuşları için geçerli değildir.

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

    içinde seri hale gerekir: örneğin

özellik adı "adıyla" içine serializes, ancak anahtar Item1 "Öğe1" içine serializes olduğunu

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

haber;

Özellik adlarını serileştirmek için CustomJsonWriter'ı oluşturmaya çalıştım, ancak aynı zamanda dikte anahtarlarını da değiştirir.

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

cevap

9

Bir şeyin nasıl serileştirildiğini/serileştirildiğini değiştirmek için bir JsonProperty kullanabilirsiniz. Nesnenizi tanımladığınızda, özellik öğelerini JSON'da farklı şekilde temsil edilmesini istediğiniz alanlara ekleyin. Bu sadece NewtonsoftJSON ile çalışır. Diğer kütüphaneler bunu farklı yapabilir.

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

Bu bir ihlal değildir. Veri serileştirme ile uğraşırken gerekli olabilecek bir haritalama sağlar. Bunun nedeni, C# değişken adları ile temel serileştirme formatı arasındaki uyumsuzluğa bağlıdır - JSON ile sınırlı değildir. – Metro

+1

, eşlemeyi belirlemek için kullanılabilecek bir kural veya kural varsa, o zaman DRY – Liero

+0

ihlalidir. DRY ilkesi "Her bilgi parçasının bir sistem içinde tek, kesin, otoriter bir temsili olması gerekir." Bir sistemin herhangi bir tek elemanının, mantıksal olarak birbiriyle ilgisiz diğer unsurlarda bir değişiklik gerektirmediği gibi, mantıksal olarak ilişkili olan tüm unsurlar, öngörülebilir ve tekdüze bir şekilde değişmektedir ve dolayısıyla senkronize tutulmaktadır. " – Liero

37

CamelCasePropertyNamesContractResolver'u kullanmayı deneyebilirsiniz.

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

Sadece sözlük tuşlarını nasıl kullanacağından emin değilim ve bunu denemek için bu saniyeye zamanım yok. Anahtarları doğru şekilde ele almazsa, kendi özel JSON yazıcınızı yazmaktan ziyade geleceğe bakmaya değerdir.

+0

ihlali Bu seçeneğe dikkat edin. Bu seçenek, seri hale getirilmiş sözlüklerin tuşlarına da neden olur. Bu genellikle istenen değil. – user1936595

İlgili konular