Трансформатор JSON для JSON

У меня есть сценарий.

Требуемый ввод и вывод: JSON.

// Input
{
  "OldObject": {
    "Time": 1351160457922,
    "Name": "OName",
    "quantity": 100,
    "price": 10
  }
}


// Output
{
  "NewObject": {
    "Time": 1351160457922,
    "Title": "OName",
    "quantity": 100
  }
}

Мне нужен код преобразования или предпочтительно язык типа xslt для преобразования json из одного формата в другой. Этот трансформатор также должен быть быстрым, поскольку трансформация будет выполняться "на лету".

Edit
У меня нет определения принимаемого объекта INPUT, и он может измениться во время выполнения. но я могу использовать класс для объекта OUTPUT, если это необходимо. Я попытался сделать это как json → xml → xslt → xml → json, но с этой целью получено 1000 объектов в секунду, и этот процесс может повлечь накладные расходы.
Я также не могу использовать JavaScript, поскольку myApp - это простое приложение на основе java-приложений на основе Windows, и использование JavaScript может вызвать накладные расходы.

Ответ 1

Вы можете использовать ZORBA и JsonIQ http://www.jsoniq.org/ Однако, это нативная библиотека, она поставляется с оберткой, поэтому вы можете использовать ее в Java.

Ответ 2

Попробуйте JOLT. Это библиотека преобразования JSON для JSON, написанная на Java. Он был создан в проекте, который преобразовывал много JSON из бэкэнда ElasticSearch в интерфейс api.

Для преобразования JSON, которое вы указали в своей проблеме, спецификация смещения Jolt:

// Jolt "shift" spec
{
    "OldObject": {
        "Time": "NewObject.Time",   
        "Name": "NewObject.Title", // if the input has "OldObject.Name", copy it value
                                   // to "NewObject.Title
        "quantity": "NewObject.quantity"
    }
}

Ответ 3

Вы можете сделать это преобразование с помощью патча JSON.

Пример с jsonpatch-js:

var transformations = [
  { move: '/OldObject', to: '/NewObject' },
  { remove: '/NewObject/price' },
  { move: '/NewObject/Name', to: '/NewObject/Title' }
];

var oldObject = { "OldObject": { "Time": 1351160457922, "Name": "OName", "quantity": 100, "price": 10 } };

jsonpatch.apply(oldObject, transformations);

Я не проверял предоставленное, но должно работать так.

Существуют реализации Java для патча JSON:

Ответ 5

Другой вариант - использовать библиотеку Logz.io Sawmill. Вы определяете конвейер и выполняете его. Для вас пример:

{
  steps: [
    {
      rename {
         config {
            from: "OldObject"
            to: "NewObject"
         }
      }
    }

    {
      removeField {
        config {
          path: "NewObject.price"
        }
      }
    }

    {
      rename {
        config {
          from: "NewObject.Name"
          to: "NewObject.Title"
        }
      }
    }
  ]
}

Ответ 6

Вы можете попробовать Java-библиотеку Silencio, которая позволяет конвертировать каждый node файла JSON в новые значения. Вы можете решить, какие и как следует преобразовывать узлы.