Arhn - архитектура программирования

JSON в XML — Groovy: поймано: nu.xom.IllegalNameException: имена NCName не могут начинаться с символа ‹N›

Версия Groovy: 2.4.6 JAVA 1.7

Попытка преобразовать следующий большой двоичный объект JSON в XML. У меня есть другие записи больших двоичных объектов JSON, которые отличаются по структуре, объектам в JSON из разных заданий Jenkins, типу заданий, нет. параметров и т. д. Конечная цель — преобразовать файл JSON (из коллекции MongoDB; команда mongoexport) в XML и, наконец, импортировать его в строки EXCEL (которые доступны в Excel из коробки на вкладке «Данные»).

Пример записи большого двоичного объекта JSON (подтверждено JSON Pretty Print):

{
  "_id": {
    "$oid": "5120349es967yhsdfs907c4f"
  },
  "actions": [
    {
      "causes": [
        {
          "shortDescription": "Started by an SCM change"
        }
      ]
    },
    {

    },
    {
      "oneClickDeployPossible": false,
      "oneClickDeployReady": false,
      "oneClickDeployValid": false
    },
    {

    },
    {

    },
    {

    },
    {
      "cspec": "element * .../MyProject_latest_int/LATESTnelement * .../MyProject_integration/LATESTnelement /vobs/some_vob/gigi /main/myproject_integration/MyProject_Slot_0_maint_int/LATESTnelement * .../myproject_integration/LATESTnelement /vobs/some_vob /main/LATEST",
      "latestBlsOnConfiguredStream": null,
      "stream": null
    },
    {

    },
    {
      "parameters": [
        {
          "name": "CLEARCASE_VIEWTAG",
          "value": "jenkins_MyProject_latest"
        },
        {
          "name": "BUILD_DEBUG",
          "value": false
        },
        {
          "name": "CLEAN_BUILD",
          "value": true
        },
        {
          "name": "BASEVERSION",
          "value": "7.4.1"
        },
        {
          "name": "ARTIFACTID",
          "value": "lowercaseprojectname"
        },
        {
          "name": "SYSTEM",
          "value": "myprojectSystem"
        },
        {
          "name": "LOT",
          "value": "02"
        },
        {
          "name": "PIPENUMBER",
          "value": "7.4.1.303"
        }
      ]
    },
    {

    },
    {

    },
    {
      "parameters": [
        {
          "name": "DESCRIPTION_SETTER_DESCRIPTION",
          "value": "lowercaseprojectname_V7.4.1.303"
        }
      ]
    },
    {

    },
    {

    },
    {

    },
    {

    }
  ],
  "artifacts": [

  ],
  "building": false,
  "builtOn": "servername",
  "changeSet": {
    "items": [
      {
        "affectedPaths": [
          "vobs/some_vob/myproject/apps/app1/Java/test/src/com/giga/highlevelproject/myproject/schedule/validation/SomeActivityTest.java"
        ],
        "author": {
          "absoluteUrl": "http://11.22.33.44:8080/user/hitj1620",
          "fullName": "name1, name2 A"
        },
        "commitId": null,
        "date": {
          "$numberLong": "1489439532000"
        },
        "dateStr": "13/03/2017 21:12:12",
        "elements": [
          {
            "action": "create version",
            "editType": "edit",
            "file": "/vobs/some_vob/myproject/apps/app1/Java/test/src/com/giga/highlevelproject/myproject/schedule/validation/SomeActivityTest.java",
            "operation": "checkin",
            "version": "/main/MyProject_latest_int/2"
          }
        ],
        "msg": "",
        "timestamp": -1,
        "user": "user111"
      }
    ],
    "kind": null
  },
  "culprits": [
    {
      "absoluteUrl": "http://11.22.33.44:8080/user/nuka1620",
      "fullName": "nuka, Chuck"
    }
  ],
  "description": "lowercaseprojectname_V7.4.1.303",
  "displayName": "#303",
  "duration": 525758,
  "estimatedDuration": 306374,
  "executor": null,
  "fullDisplayName": "MyProject u00bb MyProject-build #303",
  "highlevelproject_metrics_source_url": "http://11.22.33.44:8080/job/MyProject/job/MyProject-build/303//api/json",
  "id": "303",
  "keepLog": false,
  "number": 303,
  "projectName": "MyProject-build",
  "queueId": 8201,
  "result": "SUCCESS",
  "timeToRepair": null,
  "timestamp": {
    "$numberLong": "1489439650307"
  },
  "url": "http://11.22.33.44:8080/job/MyProject/job/MyProject-build/303/"
}

Пробовал несколько сообщений для JSON >>> Решения для преобразования XML, но они либо являются пользовательским решением, либо не работают для создания выходных данных, которые можно успешно импортировать в файл EXCEL (через импорт данных Excel).

Я использовал следующий код Groovy:

import net.sf.json.JSON
import net.sf.json.JSONSerializer
import net.sf.json.xml.XMLSerializer

def str = "{ \"_id\": { \"$oid\": \"5120349es967yhsdfs907c4f\"}, \"actions\": [ { \"causes\": [ { \"shortDescription\": \"Started by an SCM change\"} ]}, {}, { \"oneClickDeployPossible\": false, \"oneClickDeployReady\": false, \"oneClickDeployValid\": false}, {}, {}, {}, { \"cspec\": \"element * .../MyProject_latest_int/LATESTnelement * .../MyProject_integration/LATESTnelement /vobs/some_vob/gigi /main/myproject_integration/MyProject_Slot_0_maint_int/LATESTnelement * .../myproject_integration/LATESTnelement /vobs/some_vob /main/LATEST\", \"latestBlsOnConfiguredStream\": null, \"stream\": null}, {}, { \"parameters\": [ { \"name\": \"CLEARCASE_VIEWTAG\", \"value\": \"jenkins_MyProject_latest\"}, { \"name\": \"BUILD_DEBUG\", \"value\": false}, { \"name\": \"CLEAN_BUILD\", \"value\": true}, { \"name\": \"BASEVERSION\", \"value\": \"7.4.1\"}, { \"name\": \"ARTIFACTID\", \"value\": \"lowercaseprojectname\"}, { \"name\": \"SYSTEM\", \"value\": \"myprojectSystem\"}, { \"name\": \"LOT\", \"value\": \"02\"}, { \"name\": \"PIPENUMBER\", \"value\": \"7.4.1.303\"} ]}, {}, {}, { \"parameters\": [ { \"name\": \"DESCRIPTION_SETTER_DESCRIPTION\", \"value\": \"lowercaseprojectname_V7.4.1.303\"} ]}, {}, {}, {}, {} ], \"artifacts\": [ ], \"building\": false, \"builtOn\": \"servername\", \"changeSet\": { \"items\": [ { \"affectedPaths\": [ \"vobs/some_vob/myproject/apps/app1/Java/test/src/com/giga/highlevelproject/myproject/schedule/validation/SomeActivityTest.java\" ], \"author\": { \"absoluteUrl\": \"http://11.22.33.44:8080/user/hitj1620\", \"fullName\": \"name1, name2 A\"}, \"commitId\": null, \"date\": { \"$numberLong\": \"1489439532000\"}, \"dateStr\": \"13/03/2017 21:12:12\", \"elements\": [ { \"action\": \"create version\", \"editType\": \"edit\", \"file\": \"/vobs/some_vob/myproject/apps/app1/Java/test/src/com/giga/highlevelproject/myproject/schedule/validation/SomeActivityTest.java\", \"operation\": \"checkin\", \"version\": \"/main/MyProject_latest_int/2\"} ], \"msg\": \"\", \"timestamp\": -1, \"user\": \"user111\"} ], \"kind\": null}, \"culprits\": [ { \"absoluteUrl\": \"http://11.22.33.44:8080/user/nuka1620\", \"fullName\": \"nuka, Chuck\"} ], \"description\": \"lowercaseprojectname_V7.4.1.303\", \"displayName\": \"#303\", \"duration\": 525758, \"estimatedDuration\": 306374, \"executor\": null, \"fullDisplayName\": \"MyProject u00bb MyProject-build #303\", \"highlevelproject_metrics_source_url\": \"http://11.22.33.44:8080/job/MyProject/job/MyProject-build/303//api/json\", \"id\": \"303\", \"keepLog\": false, \"number\": 303, \"projectName\": \"MyProject-build\", \"queueId\": 8201, \"result\": \"SUCCESS\", \"timeToRepair\": null, \"timestamp\": { \"$numberLong\": \"1489439650307\"}, \"url\": \"http://11.22.33.44:8080/job/MyProject/job/MyProject-build/303/\"}" 
JSON json = JSONSerializer.toJSON( str )
XMLSerializer xmlSerializer = new XMLSerializer()
xmlSerializer.setTypeHintsCompatibility( false )
String xml = xmlSerializer.write( json )
System.out.println(xml)

Что дает мне следующее сообщение об ошибке, почему я получаю эту ошибку, когда JSON lint/validation показывает, что это действительный JSON:

Caught: nu.xom.IllegalNameException: NCNames cannot start with the character 24
nu.xom.IllegalNameException: NCNames cannot start with the character 24
       at nu.xom.Verifier.throwIllegalNameException(Unknown Source)
       at nu.xom.Verifier.checkNCName(Unknown Source)
       at nu.xom.Element._setLocalName(Unknown Source)
       at nu.xom.Element.<init>(Unknown Source)
       at nu.xom.Element.<init>(Unknown Source)
       at net.sf.json.xml.XMLSerializer.newElement(XMLSerializer.java:869)
       at net.sf.json.xml.XMLSerializer.processJSONObject(XMLSerializer.java:989)
       at net.sf.json.xml.XMLSerializer.processJSONValue(XMLSerializer.java:1040)
       at net.sf.json.xml.XMLSerializer.processJSONObject(XMLSerializer.java:990)
       at net.sf.json.xml.XMLSerializer.write(XMLSerializer.java:605)
       at net.sf.json.xml.XMLSerializer.write(XMLSerializer.java:570)
       at net.sf.json.xml.XMLSerializer$write$0.call(Unknown Source)
       at ConvertJson2xml.run(ConvertJson2xml.groovy:110)
       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 1
14.03.2018

  • Почему бы не использовать классы Groovy для записи XML и анализа json, которые поставляются с языком stackoverflow.com/questions/37592450/groovy-json-to-xml-dynamic? Почему бы не написать документ Excel напрямую, а не через какой-либо формат XML? Например, с jameskleeh.com/groovy-excel-builder? 15.03.2018
  • @tim_yates Когда вы говорите о написании XML в Groovy, вы имеете в виду написание пользовательского кода? Если да, то работать не будет. В одной коллекции mongodb у меня есть 100 заданий Jenkins (со временем меняющихся для его параметров, конфигураций и т. д.), которые содержат неструктурированные данные JSON. Конечная цель — импортировать пару ключ=значение в Excel. Данные JSON не могут быть отправлены в Excel из коробки, поэтому я подумал, что сначала должен преобразовать JSON в XML. Написание документа Excel напрямую имеет смысл, но будет больше работы, которая потребует поддерживаемого кода (как я уже упоминал, несколько заданий в одной коллекции с разной структурой из-за различных плагинов). 15.03.2018
  • @tim_yates Я хотел бы увидеть ваш вклад, если вы можете указать, какой класс я могу использовать. Решение здесь: stackoverflow.com/questions/ 29937254/ не является общим (т. е. настраивается для полей данных этого сообщения). Попытка JSON2CSV, JSONV (GitHub) или JQ потребует некоторого времени для реализации здесь (политики/процедуры). 15.03.2018
  • Имена XML не могут начинаться с $. Если вы хотите преобразовать в XML, вам необходимо убедиться, что преобразованные имена начинать с разрешенного символа. 15.03.2018
  • @kjhughes точно. Только что понял. Спасибо за ответ. 15.03.2018
  • @tim_yates Код stackoverflow.com/questions/37592450/groovy -json-to-xml-dynamic не является универсальным. Для моего большого двоичного объекта JSON (после удаления знака $) я все еще получаю ошибки. Caught: groovy.lang.MissingPropertyException: No such property: key for class: java.lang.Boolean и когда я закомментировал логическую часть, он выдал ошибку для строковой части Caught: groovy.lang.MissingPropertyException: No such property: key for class: java.lang.String 15.03.2018

Ответы:


1

ХОРОШО. Это был действительный JSON, но это не значит, что он также будет действительным XML.

Похоже, знак $ не допускается в именах объектов в формате XML при преобразовании из JSON в XML.

Удаление ** $ в большом двоичном объекте JSON, **Решено!! следующая проблема:

Чтобы удалить его (это могут сделать sed или tr -d '$').

def str = "{ \"_id\": { \"oid\": \"5120349es967yhsdfs907c4f\"}, \"actions\": [ { \"causes\": [ { \"shortDescription\": \"Started by an SCM change\"} ]}, {}, { \"oneClickDeployPossible\": false, \"oneClickDeployReady\": false, \"oneClickDeployValid\": false}, {}, {}, {}, { \"cspec\": \"element * .../MyProject_latest_int/LATESTnelement * .../MyProject_integration/LATESTnelement /vobs/some_vob/gigi /main/myproject_integration/MyProject_Slot_0_maint_int/LATESTnelement * .../myproject_integration/LATESTnelement /vobs/some_vob /main/LATEST\", \"latestBlsOnConfiguredStream\": null, \"stream\": null}, {}, { \"parameters\": [ { \"name\": \"CLEARCASE_VIEWTAG\", \"value\": \"jenkins_MyProject_latest\"}, { \"name\": \"BUILD_DEBUG\", \"value\": false}, { \"name\": \"CLEAN_BUILD\", \"value\": true}, { \"name\": \"BASEVERSION\", \"value\": \"7.4.1\"}, { \"name\": \"ARTIFACTID\", \"value\": \"lowercaseprojectname\"}, { \"name\": \"SYSTEM\", \"value\": \"myprojectSystem\"}, { \"name\": \"LOT\", \"value\": \"02\"}, { \"name\": \"PIPENUMBER\", \"value\": \"7.4.1.303\"} ]}, {}, {}, { \"parameters\": [ { \"name\": \"DESCRIPTION_SETTER_DESCRIPTION\", \"value\": \"lowercaseprojectname_V7.4.1.303\"} ]}, {}, {}, {}, {} ], \"artifacts\": [ ], \"building\": false, \"builtOn\": \"servername\", \"changeSet\": { \"items\": [ { \"affectedPaths\": [ \"vobs/some_vob/myproject/apps/app1/Java/test/src/com/giga/highlevelproject/myproject/schedule/validation/SomeActivityTest.java\" ], \"author\": { \"absoluteUrl\": \"http://11.22.33.44:8080/user/hitj1620\", \"fullName\": \"name1, name2 A\"}, \"commitId\": null, \"date\": { \"numberLong\": \"1489439532000\"}, \"dateStr\": \"13/03/2017 21:12:12\", \"elements\": [ { \"action\": \"create version\", \"editType\": \"edit\", \"file\": \"/vobs/some_vob/myproject/apps/app1/Java/test/src/com/giga/highlevelproject/myproject/schedule/validation/SomeActivityTest.java\", \"operation\": \"checkin\", \"version\": \"/main/MyProject_latest_int/2\"} ], \"msg\": \"\", \"timestamp\": -1, \"user\": \"user111\"} ], \"kind\": null}, \"culprits\": [ { \"absoluteUrl\": \"http://11.22.33.44:8080/user/nuka1620\", \"fullName\": \"nuka, Chuck\"} ], \"description\": \"lowercaseprojectname_V7.4.1.303\", \"displayName\": \"#303\", \"duration\": 525758, \"estimatedDuration\": 306374, \"executor\": null, \"fullDisplayName\": \"MyProject u00bb MyProject-build #303\", \"highlevelproject_metrics_source_url\": \"http://11.22.33.44:8080/job/MyProject/job/MyProject-build/303//api/json\", \"id\": \"303\", \"keepLog\": false, \"number\": 303, \"projectName\": \"MyProject-build\", \"queueId\": 8201, \"result\": \"SUCCESS\", \"timeToRepair\": null, \"timestamp\": { \"numberLong\": \"1489439650307\"}, \"url\": \"http://11.22.33.44:8080/job/MyProject/job/MyProject-build/303/\"}" 

Поймано: nu.xom.IllegalNameException: NCNames не может начинаться с символа .

14.03.2018
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..