Json.Net: свойство Serialize / Deserialize в качестве значения, а не как объект

Как я могу достичь следующего представления JSON classа Id при использовании в другом classе?

class Car { public StringId Id { get; set; } public string Name { get; set; } } class StringId { public string Value { get; set; } } // --------------------------------------------- // Desired representation { "Id": "someId", "Name": "Ford" } // Default (undesired) representation { "Id" : { "Value": "someId" }, "Name": "Ford" } 

Вы можете добавить TypeConverter для StringId . Json.NET забирает конвертер типов и использует его для преобразования из строки и в строку:

 [TypeConverter(typeof(StringIdConverter))] class StringId { public string Value { get; set; } } class StringIdConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) return true; return base.CanConvertFrom(context, sourceType); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(StringId)) return true; return base.CanConvertTo(context, destinationType); } public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { return new StringId { Value = (string)value }; } return base.ConvertFrom(context, culture, value); } public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string) && value is StringId) { return ((StringId)value).Value; } return base.ConvertTo(context, culture, value, destinationType); } } 

Если ваше строковое представление содержит встроенные числовые данные или данные о дате / времени, обязательно конвертируйте эти данные с использованием culture прошедшей в, а не по умолчанию, текущей культуры. Json.NET будет вызывать конвертер с правильной культурой, которая по умолчанию является инвариантной культурой , тем самым гарантируя, что сгенерированные файлы JSON переносятся между культурами.

Пример скрипки .

Однако обратите внимание, что если вы используете .Net Core, поддержка преобразователей типов была добавлена ​​только с Json.NET 10.0.1 . И поддержка типов преобразователей в Json.NET Portable builds не доступна с 10.0.3.

В качестве альтернативы, если вы не возражаете добавить Json.NET-специфические атрибуты для своего типа, вы можете использовать пользовательский JsonConverter :

 [JsonConverter(typeof(StringIdConverter))] class StringId { public string Value { get; set; } } class StringIdConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(StringId); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var token = JToken.Load(reader); return new StringId { Value = (string)token }; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var id = (StringId)value; writer.WriteValue(id.Value); } } 

Вы также можете настроить преобразователь в глобальных настройках .

Пример скрипки .

Вы можете переопределить метод ToString classа StringId чтобы вернуть значение

  public override string ToString() { return this.Value; } 

TypeConverter вам понадобится TypeConverter для десериализации из строки в StringId

 public class StringIdConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) { return true; } return base.CanConvertFrom(context, sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) { return new StringId(value.ToString()); } return base.ConvertFrom(context, culture, value); } } 

И украсьте свой class StringId этим атрибутом

 [TypeConverter(typeof(StringIdConverter))] public class StringId{ ... } 
  • Json Сериализация Java, которая работает с GWT
  • Преобразование любого объекта в массив байтов в java
  • Сериализовать компоненты JavaFX
  • Использование readObject / writeObject в сериализации
  • Джерси + jackson JSON формат даты формат - как изменить формат или использовать пользовательские JacksonJsonProvider
  • Сериализация jacksonа JSON, предотrotation рекурсии путем определения уровня
  • XSLT: как преобразовать XML-узел в строку
  • Использование JSON.NET для возврата ActionResult
  • Невозможно сериализовать словарь с помощью сложного ключа с помощью Json.net
  • Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с classом JsonConvert в Json.NET
  • Сериализация / десериализация пользовательской коллекции с дополнительными свойствами с помощью Json.Net
  • Interesting Posts

    как проверить версию jdk, используемую для компиляции файла .class

    Статус HTTP 404 – Запрошенный ресурс (/) недоступен

    выбор контакта из автозаполнения textview

    Почему Core i5 5300u лучше, чем i7 5600u?

    Является ли использование Serializable в Android плохим?

    Значение cast для значения «Int32» не выполнено, поскольку материализованное значение равно null

    Флуктуация ping для определенного ISP-магистрали

    Почему нельзя «преобразовать (s.begin (), s.end (), s.begin (), tolower)« успешно выполняться?

    Слабая переменная NSString не равна нулю после установки единственной сильной ссылки на nil

    Монитор ноутбука Windows (7 и Vista) не возвращается после закрытия крышки

    Добавление gif-изображения в ImageView в android

    Как остановить воспроизведение видео на YouTube в Android-браузере?

    Вождение двух мониторов Dell UP2715K

    Доступ к ресурсам JAR

    как зарегистрировать приложение, чтобы открыть файл pdf в моем приложении в ipad

    Давайте будем гением компьютера.