Как преобразовать список в список с помощью библиотеки jolt - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь преобразовать json в другой, используя библиотеку Jolt, и не получаю желаемого результата.

Вот мой входной файл.


    {
      "maxResults": 150,
      "total": 89,
      "issues": [
        {
          "key": "1",
          "fields": {
            "fixVersions": [
              {
                "self": "FIX1-01",
                "id": "11"
              },
              {
                "self": "FIX1-02",
                "id": "12"
              }
            ]
          }
        },
        {
          "key": "2",
          "fields": {
            "fixVersions": [
              {
                "self": "FIX2-01",
                "id": "21"
              }
            ]
          }
        },
        {
          "key": "3",
          "fields": {
            "fixVersions": []
          }
        }
      ]
    }
    
And this is the spec file I am using for transformation.
<pre>
[
  {
    "operation": "shift",
    "spec": {
      "issues": {
        "*": {
          "key": "[&1].id",
          "fields": {
            "fixVersions": {
              "*": {
                "self": "[&1].fixVersion.name"
              }
            }
          }
        }
      }
    }
  }
]

И я я получаю этот вывод


    [ {
      "id" : "1",
      "fixVersion" : {
        "name" : [ "FIX1-01", "FIX2-01" ]
      }
    }, {
      "fixVersion" : {
        "name" : "FIX1-02"
      },
      "id" : "2"
    }, {
      "id" : "3"
    } ]

Это неправильно. Что он делает, так это то, что он получает первое значение собственного поля каждой проблемы и заполняет его как массив в первых fixVersions вывода, а также получает второе значение поля self и заполняет его во второй fixVersions. Что я хочу сделать, так это сохранить структуру такой, какая она есть на входе, просто измените имя собственного поля следующим образом.


    [ {
      "id" : "1",
      "fixVersion" : [
       { 
        "name" : "FIX1-01" 
       },
       { 
        "name" : "FIX1-02" 
       }
      ]
    }, {
      "fixVersion" : [
       { 
        "name" : "FIX2-01" 
       }
      ],
      "id" : "2"
    }, {
      "id" : "3"
    } ]

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Посмотрите, подходит ли этот spe c то, что вы ищете:

[
  {
    "operation": "shift",
    "spec": {
      "issues": {
        "*": {
          "key": "[&1].id",
          "fields": {
            "fixVersions": {
              "*": {
                "self": "[&4].fixVersion[&1].name"
              }
            }
          }
        }
      }
    }
  }
]

Вывод, использующий его против вашего ввода, приведет к:

[ {
  "id" : "1",
  "fixVersion" : [ {
    "name" : "FIX1-01"
  }, {
    "name" : "FIX1-02"
  } ]
}, {
  "id" : "2",
  "fixVersion" : [ {
    "name" : "FIX2-01"
  } ]
}, {
  "id" : "3"
} ]

Обратите внимание на изменение индексы, которые вы используете для перестройки списка fixVersion (необходимо также учитывать, где возникает проблема с индексом), вам не хватало этого:

[&4].fixVersion[&1].name
0 голосов
/ 28 мая 2020

Поскольку вы использовали тег XSLT и тег Java, вы можете использовать XSLT и / или XQuery 3 с Saxon 9 и использовать, например,

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'text';

declare variable $json as xs:string external := '{
      "maxResults": 150,
      "total": 89,
      "issues": [
        {
          "key": "1",
          "fields": {
            "fixVersions": [
              {
                "self": "FIX1-01",
                "id": "11"
              },
              {
                "self": "FIX1-02",
                "id": "12"
              }
            ]
          }
        },
        {
          "key": "2",
          "fields": {
            "fixVersions": [
              {
                "self": "FIX2-01",
                "id": "21"
              }
            ]
          }
        },
        {
          "key": "3",
          "fields": {
            "fixVersions": []
          }
        }
      ]
    }';


transform(map {
    'source-node' : json-to-xml($json),
    'stylesheet-node' : <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
      <xsl:mode on-no-match="shallow-copy"/>
      <xsl:template match="*:string[@key = 'self']">
        <xsl:copy>
          <xsl:attribute name="key">name</xsl:attribute>
          <xsl:value-of select="."/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
})?output => xml-to-json(map { 'indent' : true() })

https://xqueryfiddle.liberty-development.net/bdxZ8R

...