Python объединяет значения для определенного ключа через запятую - PullRequest
0 голосов
/ 01 октября 2018

Есть ли способ объединить несколько значений для конкретного ключа, разделенных запятой.В моем случае я пытаюсь напечатать несколько значений service.names, чтобы они могли быть напечатаны в одной строке, разделенной запятой.

Как можно объединить значения service.name, разделенные запятой, чтобы они печатались, как показано ниже:

{
  "number": 1,
  "service name": "FTP-Server, SSH-Server"
}

Я попробовал ниже в pyjq, но он разделяет значения на отдельный блок.

.group[].group[] | { "number": .number, "service name": .service[].name }

Вот вывод, который я получаю

{
  "number": 1,
  "service name": "FTP-Server"
}
{
  "number": 1,
  "service name": "SSH-Server"
}

Учитываяниже те же данные с / без объектного словаря.Я в порядке с любым форматом.

JSON-файл с включенным объектным словарем

{
    "objects-dictionary": [
        {
            "name": "FTP-Server", 
            "port": "21", 
            "type": "service-tcp", 
            "uid": "ef245528-9a3d-11d6-9eaa-3e5a6fdd6a6a"
        }, 
        {
            "name": "SSH-Server", 
            "port": "22", 
            "type": "service-tcp", 
            "uid": "dff4f7ba-9a3d-11d6-91c1-3e5a6fdd5151"
        }
    ], 
    "base": [
        {
           "number": 1, 
            "service": [
                "ef245528-9a3d-11d6-9eaa-3e5a6fdd6a6a",
                "dff4f7ba-9a3d-11d6-91c1-3e5a6fdd5151"
            ],
            "uid": "90088436-ac42-4363-84a6-3dbebf3c11f0"
        }
    ]
}

JSON-файл без объектного словаря

{
    "group": [
        {
            "group": [
                { 
                    "number": 1, 
                    "service": [
                        {
                            "name": "FTP-Server", 
                            "port": "21", 
                            "type": "service-tcp", 
                            "uid": "ef245528-9a3d-11d6-9eaa-3e5a6fdd6a6a"
                        }, 
                        {
                            "name": "SSH-Server", 
                            "port": "22", 
                            "type": "service-tcp", 
                            "uid": "dff4f7ba-9a3d-11d6-91c1-3e5a6fdd5151"
                        }
                    ], 
                    "uid": "90088436-ac42-4363-84a6-3dbebf3c11f0"
                }
            ]
        }
    ]
}

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Со вторым текстом JSON следующий фильтр:

.group[].group[]
| { "number": .number, "service name": ([.service[].name]|join(", ")) }

создает вывод, который вы указали, что вы ожидали (включая пробел после запятой):

{
  "number": 1,
  "service name": "FTP-Server, SSH-Server"
}
0 голосов
/ 01 октября 2018

Довольно неясно, что вы ожидаете получить в качестве выходных данных, но, учитывая ваш последний пример и используя jq, вы можете объединить оба имени службы вместе:

<file jq '[.group[].group[].service[].name] | join(",")'

Обратите внимание, что join ожидает массив, поэтомуname s должен находиться внутри массива [ ... ].

Если вам нужно добавить эту строку в сам объект, вы можете сделать что-то вроде:

<file jq '.service.name=([.group[].group[].service[].name] | join(","))'
...