JsonElement эквивалентный JObject.ToObject - PullRequest
0 голосов
/ 18 октября 2019

Я портирую ядро ​​2.2 SDK на 3.0. Newtonsoft был заменен родным двигателем Json. Мой SDK берет JObject и конвертирует его в конкретный тип, используя ToObject<T>()

Что эквивалентно этому с JsonElement?

Я хочу десериализовать класс Message, чей Eventсвойство может быть определено только во время выполнения:

private class Message
{
    public string Type { get; set; }
    public JsonElement Event { get; set; }
    public string[] GenericArguments { get; set; }
    public int? Id { get; set; }
}

В System.Text.Json мне нужно использовать этот код для сериализации Event в JSON, а затем снова десериализовать его до окончательного типа:

    private dynamic ParseTypeData(Message message)
    {
        Type type = typeFinder.GetEventType(message.Type);
        if (message.GenericArguments.Length > 0)
        {
            var genericArguments = message.GenericArguments
                .Select(typeFinder.GetType)
                .ToArray();

            type = type.MakeGenericType(genericArguments);
        }

        var json = message.Event.GetRawText();
        return JsonSerializer.Deserialize(json, type, Options);
    }

В JSON.NET класс был:

    private class Message
    {
        public string Type { get; set; }
        public JObject Event { get; set; }
        public string[] GenericArguments { get; set; }
        public int? Id { get; set; }
    }

И десериализация Event необходима только:

return message.Event.ToObject(type);
...