Kaip pakeisti nuosavybės pavadinimus, kai serializuojate su Json.net?

Turiu kai kuriuos C # DataSet objekto duomenis. Dabar galiu serializuoti, naudodamas tokį „Json.net“ konverterį

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

Tačiau, spausdinant į .json failą, data nuosavybės pavadinimai. Norėčiau, kad nuosavybės pavadinimai būtų kažkas (tarkim, pakeiskite „foo“ į „bar“).

Json.net dokumentuose skyriuje „JSON Serialization“ ir „Deserialization → Serialization Attributes“ nurodoma: „JsonPropertyAttribute ... leidžia konfigūruoti pavadinimą“. Tačiau nėra jokio pavyzdžio. Ar kas nors žino, kaip naudoti „JsonPropertyAttribute“, kad pakeistumėte turto pavadinimą į kitą?

( Tiesioginė nuoroda į dokumentaciją )

Json.net dokumentai atrodo silpni. Jei turite puikų pavyzdį, aš stengsiuosi jį pridėti prie oficialių dokumentų. Ačiū!

339
10 янв. nustatytas į culix 10 sausis 2012-01-10 02:24 '12 at 2:24 2012-01-10 02:24
@ 3 atsakymai

Galite papuošti norimą savybę valdydami jo pavadinimą naudodami [JsonProperty] kuris leidžia nurodyti kitą pavadinimą:

 using Newtonsoft.Json; // ... [JsonProperty(PropertyName = "FooBar")] public string Foo { get; set; } 

Dokumentacija: Serializacijos atributai

639
10 янв. Atsakymas, kurį pateikė Darin Dimitrov 10 sausis 2012-01-10 02:26 '12, 02:26 am 2012-01-10 02:26

Jei neturite prieigos prie klasių, kad pakeistumėte savybes arba nenorite visada naudoti tos pačios pervadinimo savybės, galite ją pervadinti, sukurdami pasirinktinį konverterį.

Pavyzdžiui, jei turite klasę, vadinamą „ MyCustomObject , turinčią nuosavybę, pavadintą „ LongPropertyName , galite naudoti LongPropertyName :

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

Tada skambinkite serializavimu ir pateikite konverterį:

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

Ir rezultatas bus sutrumpintas iki {"Short": "prop value"} vietoj {"LongPropertyName": "prop value"}

Daugiau informacijos apie pasirinktinius tirpiklius rasite čia.

59
23 окт. Atsakymą StingyJack pateikė spalio 23 d. 2015-10-23 00:03 '15 - 0:03 2015-10-23 00:03

Yra dar vienas būdas tai padaryti naudojant konkrečią „ NamingStrategy“ , kuri gali būti taikoma klasei arba nuosavybei, juos dekoruojant [JSonObject] arba [JsonProperty] .

Yra iš anksto nustatytos pavadinimo strategijos, pvz., „ CamelCaseNamingStrategy , bet galite įgyvendinti savo.

3
06 февр. Atsakyti JotaBe 06 Feb 2018-02-06 18:21 '18, 18:21 pm 2018-02-06 18:21