Я пытаюсь преобразовать xml в json с помощью java, а затем преобразовать json обратно в xml после изменения, который должен дать тот же xml. Атрибуты xml имеют пространства имен.
Мой образец xml:
<?xml version = "1.0" encoding = "UTF-8"?>
<ns2:testplan xmlns:ns2 = "http://jazz.net/xmlns/alm/qm/v0.1/" xmlns:ns1 = "http://schema.ibm.com/vega/2008/" xmlns:ns3 = "http://purl.org/dc/elements/1.1/" xmlns:ns4 = "http://jazz.net/xmlns/prod/jazz/process/0.6/" xmlns:ns5 = "http://jazz.net/xmlns/alm/v0.1/" xmlns:ns6 = "http://purl.org/dc/terms/" xmlns:ns7 = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns8 = "http://jazz.net/xmlns/alm/qm/v0.1/testscript/v0.1/" xmlns:ns9 = "http://jazz.net/xmlns/alm/qm/v0.1/executionworkitem/v0.1" xmlns:ns10 = "http://open-services.net/ns/core#" xmlns:ns11 = "http://open-services.net/ns/qm#" xmlns:ns12 = "http://jazz.net/xmlns/prod/jazz/rqm/process/1.0/" xmlns:ns13 = "http://www.w3.org/2002/07/owl#" xmlns:ns14 = "http://jazz.net/xmlns/alm/qm/qmadapter/v0.1" xmlns:ns15 = "http://jazz.net/xmlns/alm/qm/qmadapter/task/v0.1" xmlns:ns16 = "http://jazz.net/xmlns/alm/qm/v0.1/executionresult/v0.1" xmlns:ns17 = "http://jazz.net/xmlns/alm/qm/v0.1/catalog/v0.1" xmlns:ns18 = "http://jazz.net/xmlns/alm/qm/v0.1/tsl/v0.1/" xmlns:ns20 = "http://jazz.net/xmlns/alm/qm/styleinfo/v0.1/" xmlns:ns21 = "http://www.w3.org/1999/XSL/Transform">
<ns2:projectArea href = "https://testserver:9080/qm/resource/itemOid/com.ibm.team.process.ProjectArea/_xv6jsJceEeimbPqnRT_G_Q" alias = "projectArea"/>
<ns3:identifier>https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/testplan/urn:com.ibm.rqm:testplan:70?revision=294</ns3:identifier>
<ns2:stylesheet href = "https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/testplan/urn:com.ibm.rqm:testplan:70?stylesheet=true"/>
<ns2:snapshot>
<ns3:title>testplan_70_<Reason>_<Version>_on_16 Apr 2019 05:50</ns3:title>
<ns5:updated>2019-04-16T12:20:01.644Z</ns5:updated>
<ns2:revision>294</ns2:revision>
</ns2:snapshot>
<ns2:webId>70</ns2:webId>
<ns3:title>Demo test plan 06</ns3:title>
<ns3:description/>
<ns2:creationDate>2019-01-22T10:36:40.289Z</ns2:creationDate>
<ns5:updated>2019-04-16T12:20:01.644Z</ns5:updated>
<ns5:state ns7:resource = "https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/process-info/_xv6jsJceEeRT_G_Q/workflowstate/com.ibm.rqm.process.testplan.workflow/com.ibm.rqm.planning.common.underreview">com.ibm.rqm.planning.common.underreview</ns5:state>
<ns3:creator ns7:resource = "https://testserver:9080/jts/resource/itemName/com.ibm.team.repository.Contributor/JLO1COB">abc</ns3:creator>
<ns5:owner>unassigned</ns5:owner>
<ns2:priority ns7:resource = "https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/process-info/_xv6jsJceEeimbPqnG_Q/priority/literal.priority.101">literal.priority.101</ns2:priority>
<ns2:locked>false</ns2:locked>
<ns2:component href = "https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/component/_yzQ3EZcmbPqnRT_G_Q"/>
</ns2:testplan>
Может кто-нибудь, пожалуйста, помогите мне преобразовать драгоценно, используя java.
Я пытался преобразовать с помощью org.json.XML, но он не давал правильного json с ключами/значениями jsonobject, имеющими пространства имен.
Код, который я пробовал, не дает ответа:
JSONObject jsonObject = XML.toJSONObject("xml");
Я ожидаю способ преобразования, который дает Json с правильным форматом и объекты json, имеющие пространства имен, и если я скрою этот json, он должен дать исходный xml Пожалуйста помогите.
В json нет такого понятия, как пространство имен. Но если мы преобразуем xml в json... объект json может иметь пространство имен.
Я понятия не имею, что вы имеете в виду. Вы должны привести примеры. Но когда что-то не имеет пространств имен с самого начала, нет никаких волшебных обстоятельств, которые каким-то образом сделают так, что теперь у него есть пространства имен. JSON не имеет пространств имен. Так что ничто не сделает так, чтобы у него были пространства имен.
Да, я знаю, у json не будет пространств имен. Но jsonObject или ключи могут быть правильными пространствами имен. Я дал xml выше, и у xml есть пространство имен. Мне нужно преобразовать этот xml в json и изменить определенные значения из json и преобразовать его обратно. Поэтому, когда я конвертирую его обратно в xml, мне нужно правильно вернуть пространства имен, чтобы он был действительным json
Пространства имен по сути являются частью имен элементов: они всегда одинаковы. Не помещайте пространства имен в JSON и просто используйте имена, которые достаточно уникальны, чтобы их не нужно было разделять в пространствах имен. Затем при преобразовании обратно в XML верните пространства имен. Ни одна библиотека не сделает за вас такое преобразование, сначала преобразуйте из XML в объект, затем из объекта в JSON и наоборот.
Преобразование связано с тем, что мне нужен xml с несколькими изменениями для использования в качестве тела запроса для почтового запроса.




Вы можете попробовать XmlMapper от Джексона (com.fasterxml.jackson.dataformat.xml.XmlMapper)
XmlMapper xmlMapper = new XmlMapper();
JsonNode jsonNode = xmlMapper.readTree(string.getBytes());
ObjectMapper objectMapper = new ObjectMapper();
String value = objectMapper.writeValueAsString(jsonNode);
редактировать: зависимости, которые я использовал
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.0</version>
</dependency>
Привет, спасибо за быстрый ответ. Не могли бы вы сказать мне, какие все зависимости нужны?
Должна быть версия «Jackson Dataformat XML» версии 2.9.0 (или выше?): добавлена зависимость к ответу.
Я добавил предложенную вами зависимость. Но я получаю ошибку сейчас. Вызвано: java.lang.ClassNotFoundException: org.codehaus.stax2.io.Stax2ByteArraySource в этой строке JsonNode jsonNode = xmlMapper.readTree(string.getBytes());
Откуда импортируется ваш XmlMapper? Добавлена еще одна зависимость.
@Ajith, вам нужен файл jar "stax2-api". Если у вас есть проект Maven, он загружает дополнительные файлы jar. Мой проект не был Maven, и я импортировал только эти 2 файла jar (jackson-databind и jackson-dataformat-xml), как было предложено, и получил ту же ошибку. После создания проекта Maven и попытки добавления зависимостей я увидел другие файлы jar. stax2-api-3.1.4.jar — один из них, возможно, вам понадобятся и другие jar-файлы.
Получите JSONObject и преобразуйте его в строку JSON:
JSONObject jsonObject = XML.toJSONObject("xml");
String jsonString = jsonObject.toString();
Если вы хотите красиво напечатать строку, используйте toString(int), которая принимает количество пробелов в качестве аргумента.
String prettyPrintedJson = jsonObject.toString(4);
Не решает тему вопроса...
Этот вопрос немного устарел, но я хотел бы поделиться своим ответом о той же задаче, которую я сделал недавно! Требование: Имея этот xml:
<ns2:testplan>
<ns2:snapshot>
<ns2:revision>294</ns2:revision>
</ns2:snapshot>
<ns2:webId>70</ns2:webId>
<ns2:title>Demo test plan 06</ns2:title>
</ns2:testplan>
Мы хотели бы преобразовать его в:
{
"ns2:testplan": {
"ns2:snapshot": {
"ns2:revision": 294
},
"ns2:title": "Demo test plan 06",
"ns2:webId": 70
}
}
Обратите внимание, что с принятым ответом корневой тег <ns2:testplan> и префикс пространства имен не включаются в JSON.
Чтобы настроить XmlMapper для сохранения пространства имен и добавления корневого тега, выполните следующие действия:
var module = new SimpleModule().addDeserializer(JsonNode.class, new JsonNodeDeserializer() {
@Override
public JsonNode deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return ctxt.getNodeFactory()
.objectNode()
.set("ns2:testplan", super.deserialize(p, ctxt)); // this config adds the root tag
}
});
XMLInputFactory xmlInputFactory = new WstxInputFactory();
xmlInputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false); // this one keeps the namespace prefix
XmlMapper xmlMapper = new XmlMapper(new XmlFactory(xmlInputFactory, new WstxOutputFactory()));
xmlMapper.registerModule(module);
Затем используйте код принятого ответа для преобразования XML в JSON.
Я имею в виду, что в JSON нет такой вещи, как пространства имен, так что...