#c# #json #object #dynamic
#c# #json #объект #динамический
Вопрос:
У меня есть сценарий, который я пытаюсь обдумать. У меня есть некоторый JSON, о котором я в основном не забочусь, за исключением определенных значений. Я просто хочу извлечь эти значения и добавить их в новый объект.
Вот JSON, с которого я начинаю:
{
"name": "Codex JJ",
"component": {
"Profile-1": {
"id": "Profile",
"type": "Person",
"attributes": {
"Hair-color": "blue",
"Eye-color": "brown",
"hair-color": "brown",
"height": "170cm"
},
"status": {
"employed": "true",
"ethnic": "White"
}
},
"Profile-2": {
"id": "Profile",
"type": "Person",
"attributes": {
"Hair-color": "blue",
"Eye-color": "brown",
"hair-color": "brown",
"height": "170cm"
},
"status": {
"employed": "true",
"ethnic": "White"
}
}
}
}
Я хочу реконструировать его в этот JSON:
{
"name": "NEW JSON"
"company": [
{
"Person": "new-person",
"attributes": {
"Hair-color": "blue",
"Eye-color": "brown",
"employed": "true",
"ethnic": "White"
},
{
"Person": "new-person",
"attributes": {
"Hair-color": "blue",
"Eye-color": "brown",
"employed": "true",
"ethnic": "White"
},
}
]
}
Что было бы наилучшей практикой для реализации этого? Должен ли я использовать dynamic
ключевое слово для десериализации моего входящего JSON? Как именно я могу извлечь значения и добавить их к моим созданным объектам C #, чтобы сгенерировать совершенно новую структуру JSON?
Комментарии:
1. 1- Ваш исходный json странный. ИМХО
"component": {
должно быть"component": [
и 2- я бы использовал классы .net вместо динамических типов и automapper. Затем вернемся к json.2. Да, у них очень разные структуры @bradbury9, но это по соображениям взаимной совместимости. Я думал об использовании объектов expando
Ответ №1:
Если вы просто хотите преобразовать JSON и вам не нужна (или хотите) формальная объектная модель для представления данных, вы можете использовать Json.Netиспользует API LINQ-to-JSON (JObjects) для этого:
JObject obj = JObject.Parse(json);
JObject newObj = new JObject(
new JProperty("name", obj["name"]),
new JProperty("company", new JArray(
obj["component"]
.Children<JProperty>()
.Select(jp => new JObject(
new JProperty((string)jp.Value["type"], jp.Name),
new JProperty("attributes", jp.Value["attributes"])
)
)
)
)
);
json = newObj.ToString();
Рабочая демонстрация:https://dotnetfiddle.net/zSWAL0
Ответ №2:
Вот просто другое решение с использованием jsonata (https://www.nuget.org/packages/Retyped.jsonata )
Таким образом, выражение будет:
{
"name": "NEW JSON",
"company": $each($.component, function($v, $k){
{"Person": "new-person",
"attributes": {
"Hair-color": $v.attributes.`Hair-color`,
"Eye-color": $v.attributes.`Eye-color`,
"employed": $v.status.employed,
"ethnic": $v.status.ethnic
}
}
})
}
Живая демонстрация:https://try.jsonata.org/6fpDBlo94
Комментарии:
1. Я обнаружил, что JSONata сам по себе классный, но пакет Retuped.jsonata, похоже, предназначен для запуска как часть моста. СЕТЕВОЙ проект, который вроде как заброшен. Итак, я выделил собственный порт C # для JSONata: github.com/mikhail-barg/jsonata.net.native . Наиболее важные функции уже реализованы