Mule JSON — как преобразовать пары ключ-значение в список

У меня есть полезная нагрузка json следующего формата:

{"key":"value",
 "key:1":"value",
 "key:2","value",
 "junk key":"value",
 "part":"value",
 "part:1","value", 
 "part:2","value"...}

и хотите преобразовать его в:

{"1":{
   "key":"value",
   "part":"value"
   },
 "2": {
   "key":"value",
   "part":"value"
   },
 "3": {
   "key":"value",
   "part":"value"
   }
}

есть идеи?


person Mitch Spector    schedule 30.12.2016    source источник


Ответы (2)


Вот вывод, который я мог бы получить с помощью Dataweave, просто форматирование удаления дополнительных фигурных скобок может быть выполнено в последующем процессоре сообщений с использованием MEL или простого кода Java. Надеюсь, поможет!!

Введите JSON {
"ключ":"значение1", "ключ:1":"значение2", "ключ:2":"значение3", "мусорный ключ":"значение4", "часть":"значение5", "часть:1":"значение6", "часть:2":"значение7" }

Логика переплетения данных:

%dw 1.0
%output application/json

%var keyValues = payload mapObject {
    ('$$' : $)when ( '$$' matches /key(:\d)?/)
}
%var partValues = payload mapObject {
    ('$$' : $)when ( '$$' matches /part(:\d)?/)
}
%var zipValues = (keyValues zip partValues) map {
    '$$': {
        key: $[0],
        part: $[1]
    }
}
---
zipValues map {
    '$$' : $[0]
}

Результат

[
  {
    "0": {
      "key": "value1",
      "part": "value5"
    }
  },
  {
    "1": {
      "key": "value2",
      "part": "value6"
    }
  },
  {
    "2": {
      "key": "value3",
      "part": "value7"
    }
  }
]
person Senthil c    schedule 02.01.2017
comment
Вы можете удалить объекты-оболочки с помощью {()}, например: {( zipValues ​​map { ... } )} - person Ryan Hoegg; 11.01.2017

У Senthil уже есть рабочее решение, но вот общее решение для любых ключей, содержащих двоеточие:

%dw 1.0
%output application/json
%function parseKeys(o) o pluck { 
    key: $$ replace /(\w+)(:\w+)?/ with $[1],
    group: $$ match {
        /(\w+):(\w+)/ -> $[2],
        default -> null
    },
    value: $
}
%function toNiceObject(tuples) {(tuples map {($.key): $.value})}
---
parseKeys(payload)
filter ($.group != null)
groupBy $.group
mapObject (
    '$$': toNiceObject($)
)

Я подумал, что будет лучше сначала разбить ключи (функция parseKeys), создав массив объектов с полями key, group и value. Затем мы можем filter и groupBy промежуточную структуру данных и превратить ее обратно в кортежи для объекта результата в конце (toNiceObject).

Еще одна вещь, на которую стоит обратить внимание, это использование pluck и match для работы parseKeys. pluck берет объект и создает массив применяя данную функцию к каждой паре значений ключа (кортежу) в объекте. match позволяет нам применить различные преобразования к заданному входу на основе некоторых критериев, в данном случае регулярного выражения.

person Ryan Hoegg    schedule 10.01.2017