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

Я хочу это:

{
    "level1a": "value",
    "level1b": {
        "level2a": {
            "level3a": "nestedvalue"
        },
        "level2b": "value"
    }
}

Чтобы в итоге выглядело это так:

{
    "level1a": "value",
    "level1b": {
        "level2a.level3a": "nestedvalue",
        "level2b": "value"
    }
}

А потом вот это:

{
    "level1a": "value",
    "level1b": [{
            "key": "level2a.level3a",
            "val": "nestedvalue"
        },
        {
            "key": "level2b",
            "val": "value"
        }
    ]
}

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

В конечном итоге я хочу использовать что-то вроде jq to_entries для полей с точками, чтобы затем подготовить их для ввода в Elasticsearch в качестве вложенных полей, чтобы общее количество полей было низким, при этом сохраняя всю информацию.

Есть мысли?

1 Ответ

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

Вы, очевидно, уже знаете решение второй части проблемы, поэтому вот решение первой части:

# linearize all paths of the input object or array
def dotkeys:
  def stringify: map(tostring) | join(".");
  . as $in
  | reduce paths(scalars) as $p (null;
     ($in|getpath($p)) as $v
     | setpath([$p|stringify]; $v));

def chain(key):
 .[key] |= dotkeys ;

chain("level1b")

Вывод

При вашем вводе получается:

{
  "level1a": "value",
  "level1b": {
    "level2a.level3a": "nestedvalue",
    "level2b": "value"
  }
}
...