Преобразование JSON из одной структуры в другую

#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 . Наиболее важные функции уже реализованы