Как получить десериализованный объект при использовании элемента дискриминатора типа на объекте root json с помощью System.Text. Json - PullRequest
0 голосов
/ 05 мая 2020

Извините за мой бедный английский sh.

У меня был успешный запуск кода из этого do c. Я получил новые данные JSON, и есть еще одна проблема.

Данные JSON определяются следующим образом:

{
    "id": 3,
    "title": "aaa",
    "typeDiscriminator": "search",
    "settingDataTemp": {
      "id": 11,
      "type": "11",
      "value": "11"
    }
}

А класс POCO определяется как:

public class RootContent
{
    public int id { get; set; }
    public string title { get; set; }
    public PageModuleType typeDiscriminator { get; set; }
    public IPageSubContentSetting settingDataTemp { get; set; }
}

Я хочу десериализовать объект settingDataTemp , поэтому метод JsonConverter Read, например

public override IPageSubContentSetting Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
    PageModuleType typeDiscriminator;
    string rawText;
    var discriminatorPropName = nameof(RootContent.typeDiscriminator);

    using (var jsonDocument = JsonDocument.ParseValue(ref reader))
    {
        if (!jsonDocument.RootElement.TryGetProperty(discriminatorPropName, out var typeProperty))
        {
             throw new JsonException();
        }

        var result = Enum.TryParse(typeProperty.GetString(), true, out typeDiscriminator);

        if (!result)
        {
             throw new JsonException();
        }

        rawText = jsonDocument.RootElement.GetRawText();
     }
}

Не может получить typeDiscriminator из JsonDocument.RootElement, потому что он определен на внешнем объекте.

Есть ли способ получить typeDiscriminator значение?

1 Ответ

0 голосов
/ 05 мая 2020

Я решил проблему просто с помощью NewtonSoft. Json Чтобы отредактировать структуру JSON и скопировать значение typeDiscriminator из элемента root в settingDataTemp.

...