Я пытаюсь использовать System.Text.Json.JsonSerializer
для частичной десериализации модели, поэтому одно из свойств читается как строка, содержащая оригинал JSON.
public class SomeModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Info { get; set; }
}
Пример кода
var json = @"{
""Id"": 1,
""Name"": ""Some Name"",
""Info"": {
""Additional"": ""Fields"",
""Are"": ""Inside""
}
}";
var model = JsonSerializer.Deserialize<SomeModel>(json);
должен генерировать модель, свойство Info
которой содержит объект Info из исходного JSON в виде строки:
{
"Additional": "Fields",
"Are": "Inside"
}
Не работает из коробки и выбрасывает исключение:
System.Text. Json .JsonException: ---> System.InvalidOperationException: Невозможно получить значение типа токена 'StartObject' в виде строки.
Что я пробовал до сих пор:
public class InfoToStringConverter : JsonConverter<string>
{
public override string Read(
ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
{
return reader.GetString();
}
public override void Write(
Utf8JsonWriter writer, string value, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
}
и примените его в модели как
[JsonConverter(typeof(InfoToStringConverter))]
public string Info { get; set; }
и добавьте опции к JsonSerializer
var options = new JsonSerializerOptions();
options.Converters.Add(new InfoToStringConverter());
var model = JsonSerializer.Deserialize<SomeModel>(json, options);
Тем не менее, он выдает то же исключение:
System.Text. Json .JsonException: ---> System.InvalidOperationException: Невозможно получить значение типа токена 'StartObject' как строка.
Какой правильный рецепт для приготовления того, что мне нужно? Он работал аналогичным образом, используя Newtonsoft.Json
.
Обновление
Для меня важно сохранить вложенный объект JSON как можно более оригинальным. Поэтому я бы избегал таких вариантов, как десериализацию как Dictionary
и сериализацию обратно, потому что я боюсь вносить нежелательные изменения.