Jak zmienić nazwy właściwości podczas serializacji z pomocą Json.net?

mam pewne dane w obiekcie zestawu danych w C#. Mogę serializować go już teraz za pomocą Json.net konwerter, jak ten

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

jednak przy tym są używane nazwy właściwości z data w przypadku drukowania na .plik json. Chciałbym zmienić nazwy właściwości, aby być czymś innym (powiedzmy, zmienić " foo ", "bar").

Json.net dokumentacja w dziale "szeregowania i podczas deserializacji JSON" → " atrybuty serializacji "czytamy" JsonPropertyAttribute... pozwala ustawić nazwę". Ale przykład nie. czy ktoś wie, jak korzystać z JsonPropertyAttribute do zmiany nazwy właściwości na coś innego?

(bezpośredni link do dokumentacji)

Json.net dokumenty, wygląda na to, skromne. Jeśli masz świetny przykład, postaram się dodać go w oficjalnej dokumentacji. Dziękuję!


można ozdobić właściwość, którą chcesz kontrolować jego imię


jeśli nie masz dostępu do klas, aby zmienić właściwości lub nie chcesz używać zawsze jedno i to samo właściwość rename-zmiana nazwy również można to zrobić, tworząc własny rozpoznawania.

na przykład, jeśli masz klasę o nazwie MyCustomObject, który ma właściwość o nazwie LongPropertyName, można użyć niestandardowego program rozpoznawania nazw taka...

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

następnie wywołać serializację i postaw resolver

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

i wynik będzie skrócony do {"Short": "prop wartość"} zamiast {"LongPropertyName":"prop value"}

dodatkowe informacje na temat niestandardowych zezwalających na urządzeniach tutaj


jest jeszcze jeden sposób, aby to zrobić, który wykorzystuje konkretny NamingStrategy, który może być zastosowany do klasy lub właściwości, udekorować je [JSonObject] lub [JsonProperty].

istnieją predefiniowane strategii nazewnictwa, takie jak CamelCaseNamingStrategy, ale można zrealizować swoje własne.