У меня есть вопрос относительно недавно выпущенного .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;
}