Может ли JsonDocument использоваться в качестве ContractResolver? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть вопрос относительно недавно выпущенного .NET Core 3.0 и его нового System.Text.Json, я хотел бы спросить, можно ли использовать новый JsonDocument аналогично ContractResolver классу в Newtonsoft JSON.NET.

То, что мне нужно, довольно просто, предположим, один класс с двумя свойствами

public string Name {get; set;}
public string Street {get; set;}

, и мне нужно десериализовать два разных JSON в этот класс.

JSON 1:

{"person_A":{"full-name":"Micheal","address-street":"1st avenue","address-city":"New York"},
"person_B":{"full-name":"John","address-street":"Green street","address-city":"London"}}

JSON 2:

{"man_A":{"fullname":"Bush","street":"1st avenue","city":"Washington","state":"US"},
"woman_B":{"fullname":"McCarter","street":"Green street","city":"London","state":"GB"}}

Мне нужно десериализовать свойство full-name, fullname как Name и address-street, street как Street. Другие поля JSON не нужны.

Для десериализации нескольких JSON с разными именами свойств я использую ContractResolver в JSON.NET, который работает довольно хорошо.

Причина, по которой яИзучение JsonDocument заключается в том, что я десериализирую лишь несколько свойств JSON, и при текущем подходе я должен кэшировать весь JSON. Если я правильно понял, JsonDocument должен позволить мне получить доступ только к тем свойствам, которые мне нужны.

Спасибо!

РЕДАКТИРОВАТЬ

Чтобы уточнить, что я пытаюсь спросить здесь - идея состоит в том, чтобы получить информацию об объекте Json, но не загружать его полностью, так какон не нужен, поэтому я хотел бы использовать новый JsonDocument, выбрать только те вещи, которые мне нужны, и загрузить их. Поскольку имена свойств Json отличаются от свойств моего класса, и у меня есть несколько Json, пытающихся десериализовать в один и тот же класс, мне нужно что-то вроде IContractResolver, чтобы сопоставить свойства класса с именами в Json.

Я смогсделать что-то вроде этого, но я признаю, что это не очень красиво.

<br> private readonly Dictionary propertyMappings = new Dictionary();</p> <pre>private void AddMap<U>(Expression<Func<Instrument,U>> expression, string jsonPropertyName) { var memberExpression = (MemberExpression)expression.Body; propertyMappings.Add(memberExpression.Member.Name, jsonPropertyName); } public override async Task<List<Person>> GetPeopleAsync(HttpRequestMessage request) { AddMap(x => x.Name, "full-name"); AddMap(x => x.Street, "address-street"); var result = new List<Person>(); var response = await SendAsync(request, HttpCompletionOption.ResponseHeadersRead); var stream = await response.Content.ReadAsStreamAsync(); var document = await JsonDocument.ParseAsync(stream); document.RootElement.GetProperty("people").EnumerateObject() .ToList() .ForEach(x => { var person= new Person(); foreach (var p in propertyMappings) { x.Value.TryGetProperty(p.Value, out var prop); var v = person.GetType().GetProperty(p.Key); v.SetValue(person,Convert.ChangeType(prop.ToString(),v.PropertyType)); } result.Add(person); }); return result; }

...