Как переместить значения с верхнего на нижний объект и сохранить группировку в преобразовании толчка - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь извлечь данные из большого файла JSON.Мне нужно сопоставить данные из вложенных объектов и списков по мере их извлечения.

Я написал десятки спецификаций для этого.Ближайшее «неправильное» решение оставило выходные данные полными нулевых значений.Текущая спецификация очень близка, но она оставляет некоторые данные в списках, и мне нужно, чтобы они распределялись по-другому.Он использует две смены.

    [
      {
        "Contents": [
          {
            "original": "<h4>Hour 1</h4>",
            "type": "other"
          },
          {
            "content": {
              "artist": "01art1816-01",
              "catalog_no": "cat1816-01",
              "comp_work": "comp1816-01",
              "organ": "org1816-01"
            },
            "original": "1816-01",
            "type": "listing"
          },
          {
            "content": {
              "artist": "art1816-02",
              "catalog_no": "1816-02",
              "comp_work": "1816-02",
              "organ": "1816-02"
            },
            "original": "1816-02",
            "type": "listing"
          }
        ],
        "filepath": "/listings/2018/1816/index.html",
        "program_number": "1816"
      },
      {
        "Contents": [
          {
            "original": "<h4>Hour 1</h4>",
            "type": "other"
          },
          {
            "content": {
              "artist": "02art1839-01",
              "catalog_no": "1839-01",
              "comp_work": "1839-01",
              "organ": "1839-01"
            },
            "original": "1839-01",
            "type": "listing"
          },
          {
            "original": "origin-othr",
            "type": "other"
          }
        ],
        "filepath": "/listings/2018/1839/index.html",
        "program_number": "1839"
      },
      {
        "Contents": [
          {
            "original": "<h4>Part 1</h4>",
            "type": "other"
          },
          {
            "content": {
              "artist": "03art8843-01",
              "catalog_no": "8843-01",
              "comp_work": "8843-01",
              "organ": "8843-01"
            },
            "original": "8843-01",
            "type": "listing"
          },
          {
            "content": {
              "artist": "art8843-02",
              "catalog_no": "8843-02",
              "comp_work": "8843-02",
              "organ": "8843-02"
            },
            "original": "8843-02",
            "type": "listing"
          }
        ],
        "filepath": "/listings/1988/8843/index.html",
        "program_number": "8843"
      }
    ]

Мне нужно, чтобы «номер_программы» и «путь к файлу» были в каждом объекте под содержимым.

Ожидается:

    {
      "playlist": [{
        "show": "1816",
        "path": "/listings/2018/1816/index.html",
        "artist": "artist1816-01",
        "catalog_no": "cat1816-01",
        "comp_work": "comp1816-01",
        "organ": "org1816-01"
      }, {
        "show": "1816",
        "path": "/listings/2018/1816/index.html",
        "artist": "artist1816-02",
        "catalog_no": "cat1816-02",
        "comp_work": "comp1816-02",
        "organ": "org1816-02"
      }, {
        "show": "1839",
        "path": "/listings/2018/1839/index.html",
        "artist": "artist1839-01",
        "catalog_no": "cat1839-01",
        "comp_work": "comp1839-01",
        "organ": "org1839-01"
      }, {
        "show": "8843",
        "path": "/listings/1988/8843/index.html",
        "artist": "artist8843-01",
        "catalog_no": "cat8843-01",
        "comp_work": "comp8843-01",
        "organ": "org8843-01"
      }, {
        "show": "8843",
        "path": "/listings/1988/8843/index.html",
        "artist": "artist8843-02",
        "catalog_no": "cat8843-02",
        "comp_work": "comp8843-02",
        "organ": "org8843-02"
      }]
    }

Фактически:

    {
      "playlist": [{
        "show": "1816",
        "path": "/listings/2018/1816/index.html",
        "artist": ["artist1816-01", "artist1816-02"],
        "catalog_no": ["cat1816-01", "cat1816-02"],
        "comp_work": ["comp1816-01", "comp1816-02"],
        "organ": ["org1816-01", "org1816-02"]
      }, {
        "show": "1839",
        "path": "/listings/2018/1839/index.html",
        "artist": "artist1839-01",
        "catalog_no": "cat1839-01",
        "comp_work": "comp1839-01",
        "organ": "org1839-01"
      }, {
        "show": "8843",
        "path": "/listings/1988/8843/index.html",
        "artist": ["artist8843-01", "artist8843-02"],
        "catalog_no": ["cat8843-01", "cat8843-02"],
        "comp_work": ["comp8843-01", "comp8843-02"],
        "organ": ["org8843-01", "org8843-02"]
      }]
    }

Использование этой спецификации:

    [
      {
        "operation": "shift",
        "spec": {
          "*": {
            "program_number": "playlist.[&1].show",
            "filepath": "playlist.[&1].path",
            "Contents": {
              "*": {
                "type": {
                  "listing": {
                    "@(2,content)": "playlist.[&5]"
                  }
                }
              }
            }
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "playlist": {
            "*": {
              "*": {
                "artist": "playlist[&2].artist",
                "catalog_no": "playlist[&2].catalog_no",
                "comp_work": "playlist[&2].comp_work",
                "organ": "playlist[&2].organ",
                "@show": "playlist[&2].show",
                "@path": "playlist[&2].path"
              }
            }
          }
        }
      }
    ]

1 Ответ

0 голосов
/ 06 февраля 2019

После небольшой переделки:

Сдвиги выглядят следующим образом:

  1. Копирование filepath и номер_программы в массивы
  2. Фильтр по списку типов
  3. Формат
 [
    {
      "operation": "shift",
      "spec": {
        "*": {
          "Contents": {
            "*": {
              "@": "[&3].[&1]",
              "@(2,filepath)": "[&3].[&1].path",
              "@(2,program_number)": "[&3].[&1].show"
            }
          }
        }
      }
    },
    {
      "operation": "shift",
      "spec": {
        "*": {
          "*": {
            "type": {
              "listing": {
                "@(2)": "[]"
              }
            }
          }
        }
      }
    },
    {
      "operation": "shift",
      "spec": {
        "*": {
          "show": "playlist.[&1].&",
          "path": "playlist.[&1].&",
          "content": {
            "*": {
              "@": "playlist.[&3].&"
            }
          }
        }
      }
    }
]
...