Json.net ile serileştirirken özellik adlarını nasıl değiştirebilirim?


434

Bir C # DataSet nesnesinde bazı veriler var. Şu anda böyle bir Json.net dönüştürücü kullanarak seri hale getirebilirsiniz

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);

Ancak, bu data, .json dosyasına yazdırılırken kullanılan özellik adlarını kullanır . Mülk adlarını farklı bir şey olarak değiştirmek istiyorum ('foo'yu' bar 'olarak değiştirin).

In Json.net belgelerinde 'Dizgeleştirme ve deserializing JSON' altında → o "JsonPropertyAttribute ... adı özelleştirmeye izin veriyorsa" diyor 'Diziselleştirme Nitelikleri'. Ama örnek yok. Herkes özellik adını başka bir şeyle değiştirmek için bir JsonPropertyAttribute kullanmayı biliyor mu?

( Belgelere doğrudan bağlantı )

Json.net'in belgeleri seyrek görünüyor. Harika bir örneğiniz varsa, resmi belgelere eklenmesini sağlamaya çalışacağım. Teşekkürler!


3
Bilginize, bunun bir örneği Örnekler -> JSON Serileştirmesi -> JsonPropertyAttribute adı altındaki belgelerde bulunmaktadır . Hangi noktada eklendiğinden emin değilim.
Brian Rogers

Yanıtlar:


791

Adını kontrol etmek istediğiniz [JsonProperty]özelliği, farklı bir ad belirtmenize izin veren özellikle dekore edebilirsiniz :

using Newtonsoft.Json;
// ...

[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }

Belgeler: Serileştirme Özellikleri


1
Bu, verilerimi DataSet yerine oluşturduğum özel bir nesneye okumamı gerektiriyor mu?
12'de

3
@culix, evet, bir model kullanmayı gerektiriyor. Bir DataSet zayıf yazılmış bir yapıdır, bu nedenle özellik adlarından bahsetmek çok mantıklı değildir.
Darin Dimitrov

76
Bir stenografi olarak da yapabilirsiniz[JsonProperty("FooBar")]
Bart Verkoeijen

2
@DarinDimitrov Json .NET olmadan bunu yapmanın bir yolu var mı?
CH81

12
Bir model kullanmak kolay olsa da, JSON'unuzun bir örneğini alın ve "Özel Yapıştır" -> "JSON'u Sınıflar Yapıştır" seçeneğini kullanarak boş bir .cs dosyasına yapıştırın. - Visual Studio'da yerleşiktir. - Oradan, temelde sadece .NET adlandırma kurallarını vb. Kullanmak için işleri başlık durumu / yeniden adlandırma öğeleri olarak ayarlamanız gerekir.
BrainSlugs83

71

Özellikleri değiştirmek için sınıflara erişiminiz yoksa veya her zaman aynı rename özelliğini kullanmak istemiyorsanız, yeniden adlandırma özel bir çözümleyici oluşturularak da yapılabilir.

Örneğin, MyCustomObjectadlı bir özelliğe sahip adlı bir sınıfınız varsa , bunun LongPropertyNamegibi özel bir çözümleyici kullanabilirsiniz…

public class CustomDataContractResolver : DefaultContractResolver
{
  public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    if (property.DeclaringType == typeof(MyCustomObject))
    {
      if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
      {
        property.PropertyName = "Short";
      }
    }
    return property;
  }
}

Sonra serileştirme için çağrı yapın ve çözümleyiciyi sağlayın:

 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });

Ve sonuç {"LongPropertyName": "prop değeri"} yerine {"Kısa": "prop değeri"} olarak kısaltılır

Özel çözümleyiciler hakkında daha fazla bilgi burada


1
Serileştirme sınıfınız, Newtonsoft.Json paketinin farklı bir sürümünü içeren başka bir derlemede bildirilmişse, bu daha iyi bir çözümdür. (herhangi bir hata bile atmayabilir). Bu DefaultContractResolver, JsonConvert.Serialize () yönteminin kullanıldığı aynı derlemeye konulmalıdır.
Artemious

6

Belirli kullanıyor bunu yapmanın başka bir yolu hala var NamingStrategy dekore ederek bir sınıf veya bir mülke uygulanabilir, [JSonObject]ya da [JsonProperty].

Gibi önceden tanımlanmış adlandırma stratejileri vardır CamelCaseNamingStrategy, ancak kendi stratejilerinizi uygulayabilirsiniz.

Farklı adlandırma stratejilerinin uygulanması burada bulunabilir: https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization


3
Mümkünse, lütfen özel bir NamingStrategy uygulaması örneği paylaşın
user1007074

Tabii ki değil. Bunu kendiniz yapmış olmalısınız, ancak size newtonsoft.com/json/help/html/… ' yi devralmanız gerektiğini söylemek için size zaman ayıracağım . Mevcut sınıfların uygulamasını görebilir ve kendi sınıfınızı oluşturabilirsiniz.
JotaBe

Teşekkürler - Yorumumu güncellemeliydim: aslında, GitHub'ın şantı sayesinde, biri Newtonsoft'un kendi uygulamalarından birini
user1007074 11:18 '

8
@JotaBe, bu yığın akışının ruhu değil. Ve işimi bitirmek isteyen bir programcı olarak, açıkçası, vermiş olabileceğiniz kodu kaldırmam benim için bin kat daha iyi olurdu. Ve sen de benim oyumu alırsın. 18 yıllık kodlama deneyimim var ve TripleByte tarafından c # alanında "uzman" olarak sıralandım. HER sorunun "okuyucu için alıştırma" olarak bırakılması gerekmez. Bazen sadece işimizi yapmak ve devam etmek istiyoruz.
bboyle1234

2
Size katılıyorum ve genellikle bu tür bir yorum yazmıyorum. Ancak, bu durumda, bağlantılı koda bakmak verebilirim herhangi bir açıklama daha iyi olduğunu garanti ederim. Ve json.net çok iyi belgelenmiş bir açık kaynak kütüphanedir. Uygulamalara bağlantı (mükemmel örnekler)
JotaBe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.