Преобразование встроенной строки JSON в правильный объект JSON

Я использую посредник XSLT для преобразования полезной нагрузки XML в полезную нагрузку JSON, но результирующий вывод JSON не такой, как ожидалось, поскольку весь JSON упакован как значение поля. Кроме того, мне просто нужно использовать этот посредник XSLT, а не какие-либо другие. Вот мой XSLT-код:

<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv = "http://www.w3.org/2003/05/soap-envelope"
xmlns:ns = "http://service.com">
<xsl:output method = "text" omit-xml-declaration = "yes" indent = "no"/>
<xsl:strip-space elements = "*"/>

<xsl:template match = "/">
{
    "response": {
        "animals": {
            "animal": [
                <xsl:for-each select = "//ns:animal">
                {
                    "name": "<xsl:value-of select = "ns:name"/>",
                    "color": "<xsl:value-of select = "ns:color"/>",
                    "info": {
                        "animalInfo": [
                            <xsl:for-each select = "ns:info/ns:animalInfo">
                            {
                                "someVal1": "<xsl:value-of select = "ns:someVal1"/>",
                                "someVal2": "<xsl:value-of select = "ns:someVal2"/>"
                            }<xsl:if test = "position() != last()">,</xsl:if>
                            </xsl:for-each>
                        ]
                    }
                }<xsl:if test = "position() != last()">,</xsl:if>
                </xsl:for-each>
            ]
        }
    }
}
</xsl:template>
</xsl:stylesheet>

И вот результирующий вывод JSON в виде строки внутри «текстового» поля. Весь JSON обернут как значение поля text:

ПРИМЕЧАНИЕ. Когда он завернут, есть escape-символы \. Я удалил их, чтобы сделать JSON понятным.

{
   "text": "{
      "response":{
         "animals":{
            "animal":[
               {
                  "name": "name",
                  "color": "color",
                  "info":{
                     "animalInfo":[
                        {
                           "someVal1":"someVal1",
                           "someVal2":"someVal2"
                        },
                        {
                           "someVal1":"someVal3",
                           "someVal2":"someVal4"
                        }
                     ]
                  }
               },
               {
                  "name": "name",
                  "color": "color",
                  "info":{
                     "animalInfo":[
                        
                     ]
                  }
               }
            ]
         }
      }
   }"
}

Ответ JSON, который мне нужен после удаления поля text и разворачивания его значения,

  {
    "response":{
             "animals":{
                "animal":[
                   {
                      "name": "name",
                      "color": "color",
                      "info":{
                         "animalInfo":[
                            {
                               "someVal1":"someVal1",
                               "someVal2":"someVal2"
                            },
                            {
                               "someVal1":"someVal3",
                               "someVal2":"someVal4"
                            }
                         ]
                      }
                   },
                   {
                      "name": "name",
                      "color": "color",
                      "info":{
                         "animalInfo":[
                            
                         ]
                      }
                   }
                ]
             }
          }
       }
    }

Неотредактированная полезная нагрузка JSON.

{
   "text": "{\"response\":{\"animals\":{\"animal\":[{\"name\":\"name\",\"color\":\"color\",\"info\":{\"animalInfo\":[{\"someVal1\":\"someVal1\",\"someVal2\":\"someVal2\"},{\"someVal1\":\"someVal3\",\"someVal2\":\"someVal4\"}]}},{\"name\":\"name\",\"color\":\"color\",\"info\":{\"animalInfo\":[]}}]}}}"
}

Я так старался развернуть JSON из этого текстового поля, но я не могу его разрешить и даже не уверен, почему это происходит. Может ли кто-нибудь помочь мне решить эту проблему с помощью XSLT? Заранее спасибо.

XSLT предназначен для работы с XML, а не наоборот. Почему вы не можете использовать какие-либо другие посредники здесь? Кроме того, добавьте входной формат XML и ожидаемый выходной формат JSON.

ycr 16.04.2023 17:19

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

Michael Kay 17.04.2023 00:11

Ваш XSLT создает объект JSON, содержащий один ключ (response), но в вашем выводе этот ответ встроен в другой объект JSON, который, я должен предположить, генерируется средой, в которой работает ваш XSLT (т.е. wso2-micro-integrator). Сам XSLT выглядит нормально, хотя NB вам нужно будет экранировать символы " и \, если вам нужно скопировать их из входного XML.

Conal Tuohy 17.04.2023 04:01

@ycr @MichaelKay @Conal Tuohy Я обновил свой вопрос. Я сделал ошибку при добавлении выходного JSON, так как отформатировал его, чтобы было понятно. На самом деле проблема в том, что весь JSON, который мне нужен, находится внутри этого поля text в качестве его значения. Мне нужно удалить это поле text и развернуть это значение JSON как полный JSON. Надеюсь, вы понимаете, что я имею в виду.

Some Guy 17.04.2023 06:00

@SomeGuy Я до сих пор не понимаю твоей проблемы. Получаете ли вы встроенный JSON в JSON в виде строки? Вы хотите преобразовать это в правильный JSON?

ycr 17.04.2023 14:20

Проблема не в вашем XSLT. Ваш XSLT в порядке (хотя, обратите внимание, он, вероятно, должен обрабатывать символы \ и "). Настоящая проблема заключается в среде, в которой работает ваш XSLT. Эта среда запускает XSLT, записывает его выходные данные и вставляет их в документ JSON. К сожалению. Я ничего не знаю о wso2, поэтому я не могу вам помочь.

Conal Tuohy 17.04.2023 15:19

@ycr Да, точно. Фактический JSON, который мне нужен, находится внутри тела JSON, но как значение поля text. Например: { "text": "Actual JSON is here. Wrapped as a value"}. Мне нужно развернуть его, а также удалить это text.

Some Guy 17.04.2023 15:45

@ConalTuohy О, хорошо, я понял. Это нормально. Спасибо за комментарии. Я ценю это.

Some Guy 17.04.2023 15:47
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
8
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь вы можете использовать либо Payloadfactory Mediator, либо Script Mediator. Взгляните на следующий код.

Посредник фабрики полезной нагрузки

<payloadFactory media-type = "json">
       <format>$1</format>
       <args>
         <arg expression = "json-eval($.text)" evaluator = "json"/>
       </args>
</payloadFactory>

Посредник скриптов

<property expression = "json-eval($.text)" name = "jsonText" scope = "default" type = "STRING"/>
<script language = "nashornJs"><![CDATA[
    var pl = JSON.parse(mc.getProperty('jsonText'));
    mc.setPayloadJSON(pl);
]]></script>

Другие вопросы по теме