Я готовлюсь к переходу с ASP.NET Core 2.2 на 3.0.
Поскольку я не использую какие-либо более продвинутые функции JSON (но, может быть, одну из описанных ниже), а 3.0 теперь поставляется со встроенным пространством имен/классами для JSON, System.Text.Json
, я решил посмотреть, могу ли я отбросить предыдущий по умолчанию Newtonsoft.Json
. Обратите внимание, я знаю, что System.Text.Json
не будет полностью заменять Newtonsoft.Json
.
Мне удалось сделать это везде, например,
var obj = JsonSerializer.Parse<T>(jsonstring);
var jsonstring = JsonSerializer.ToString(obj);
но в одном месте, где я заселяю существующий объект.
С Newtonsoft.Json
можно сделать
JsonConvert.PopulateObject(jsonstring, obj);
Во встроенном пространстве имен System.Text.Json
есть несколько дополнительных классов, таких как JsonDocumnet
, JsonElement
и Utf8JsonReader
, хотя я не могу найти ни одного, который принимает существующий объект в качестве параметра.
Также я недостаточно опытен, чтобы понять, как использовать уже имеющиеся.
В .Net Core может быть возможная функция (спасибо Мустафе Гурселу за ссылку), но между тем (и что, если это не так),...
... Теперь я задаюсь вопросом, возможно ли достичь чего-то подобного тому, что можно сделать с PopulateObject
?
Я имею в виду, возможно ли с любым другим классом System.Text.Json
выполнить то же самое и обновить/заменить только установленные свойства?...... или какой-нибудь другой умный обходной путь?
Вот пример того, как он может выглядеть (и он должен быть универсальным, поскольку объект, передаваемый в метод десериализации, имеет тип <T>
). У меня есть 2 строки Json, которые нужно разобрать в объект, где первый имеет некоторые свойства по умолчанию, а второй некоторые, например
Обратите внимание, что значение свойства может быть любого другого типа, кроме string
.
JSON строка 1:
{
"Title": "Startpage",
"Link": "/index",
}
JSON строка 2:
{
"Head": "Latest news"
"Link": "/news"
}
Используя 2 строки Json выше, я хочу получить объект, который приведет к:
{
"Title": "Startpage",
"Head": "Latest news",
"Link": "/news"
}
Как видно из приведенного выше примера, если свойства в 2nd имеют значения/установлены, он заменяет значения в 1st (как в случае с "Head" и "Link"), если нет, существующие значения сохраняются (как в случае с "Title")