Самый быстрый способ конвертировать XML в JSON в Java [закрыто]

171

Какие есть хорошие инструменты для быстрого и простого преобразования XML в JSON в Java?

BeachRunnerFred
источник
Я не могу использовать XML напрямую из-за требований спецификации, но я согласен с вами. Спасибо!
BeachRunnerFred
@BeachRunnerJoe: какой импорт мне нужно написать? import net.sf.json.JSONObject;или import org.json.JSONObject;. Кроме того, какую банку мне нужно включить?
Фахим Паркар
1
Вот ссылка на способ сделать это без каких-либо зависимостей, используя JAXP: stackoverflow.com/questions/27222992/…
bvdb
16
Мне нравятся закрытые вопросы SO, которые имеют такую ​​высокую видимость ... Что-то пошло не так, если такой полезный вопрос был закрыт.
Дариуш
2
я думаю, что 90% самых полезных вопросов - это "закрытая тема" .. smh
Джериль Кук

Ответы:

188

JSON в Java имеет несколько замечательных ресурсов.

Maven зависимость:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20180813</version>
</dependency>

XML.java класс, который вы ищете:

import org.json.JSONObject;
import org.json.XML;

public class Main {

    public static int PRETTY_PRINT_INDENT_FACTOR = 4;
    public static String TEST_XML_STRING =
        "<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to JSON</test>";

    public static void main(String[] args) {
        try {
            JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
            String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
            System.out.println(jsonPrettyPrintString);
        } catch (JSONException je) {
            System.out.println(je.toString());
        }
    }
}

Выход:

{"test": {
    "attrib": "moretest",
    "content": "Turn this to JSON"
}}
danieltalsky
источник
14
Предупреждение: пакет json.org.XML не существует в Android!
Людовик Ландри
2
@danieltalsky: Какой импорт мне нужно написать? import net.sf.json.JSONObject;или import org.json.JSONObject;. Кроме того, какую банку мне нужно включить?
Фахим Паркар
2
скачать все файлы, а не только XML.java. Отсюда: github.com/douglascrockford/JSON-java/downloads
Spiff
4
Что делать, если у вас есть <test attrib="moretest" content="foo">bar</test>?
wchargin
1
ПРИМЕЧАНИЕ: XML.toJSONObject () org.json также правильно преобразует списки xml в массивы json (в отличие от XmlMapper Джексона, который по умолчанию молча глотает).
Агостон Хорват
58

Чтобы преобразовать XML-файл в JSON, включите следующую зависимость

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>

и вы можете скачать Jar из репозитория Maven здесь . Затем реализовать как:

String soapmessageString = "<xml>yourStringURLorFILE</xml>";
JSONObject soapDatainJsonObject = XML.toJSONObject(soapmessageString);
System.out.println(soapDatainJsonObject);
Кишан Бхемаджияни
источник
5
+ при условии зависимости от maven
zacheusz
2
используйте версию json, упомянутую в посте, если вы работаете на Java 7, поскольку последняя версия выдает странные ошибки.
Уруг
Если у вас есть действительный файл dtd для фрагмента xml, то вы можете легко конвертировать xml в json и json в xml, используя jar ссылки затмения с открытым исходным кодом. Подробный пример проекта JAVA можно найти здесь: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Пиюш Чордия
Мне пришлось скопировать весь пакет JSON в мой проект и переименовать пакет. Добавление в Gradle выдает предупреждение о дублировании пакета с Android во время сборки.
codelearner
28

Единственная проблема с JSON в Java заключается в том, что если у вашего XML есть единственный дочерний элемент, но он является массивом, он преобразует его в объект, а не в массив. Это может вызвать проблемы, если вы динамически всегда конвертируете из XML в JSON, где, если ваш пример XML имеет только один элемент, вы возвращаете объект, но если он имеет 2+, вы возвращаете массив, что может вызвать проблемы с синтаксическим анализом для людей, использующих JSON.

Класс XML2JSON в Infoscoop имеет способ помечать элементы, которые являются массивами, перед выполнением преобразования, чтобы массивы можно было правильно отображать, даже если в XML есть только один дочерний элемент.

Вот пример его использования (на немного другом языке, но вы также можете увидеть, как массивы используются из метода nodelist2json () ссылки XML2JSON).

Маркус
источник
мы используем библиотеку "xml-to-json" в python, и это семантическая проблема. Для решения этой проблемы «массив или объект» мы пишем метод tryConvertToArray (), который возвращает массив с единственным объектом в нем. Таким образом, вы всегда можете доверять своему значению быть массивом
kommradHomer
Мне не ясно, как это решает проблему. Вы просто делаете все массивом, а не объектом? Например, если у меня есть XML <results><result><value>1</value></result></results>, будет ли он генерировать { "results" : { "result" : { "value" : "1" } } } или { "results" : [ { "result" : { "value" : "1" } } ] }
Маркус
Мы ожидаем, что это будет массив. Проблема возникает, когда этот массив имеет только 1 элемент, что делает его объектом для конвертера xml-в-json. Итак, поскольку мы ожидаем, что это будет массив даже для одного элемента, мы проверяем и конвертируем его в массив, следя за тем, чтобы у нас был массив, в котором мы ожидаем массив.
kommradHomer
Но как вы ожидаете, что конкретный элемент будет массивом? XML2JSON помечает элементы. Непонятно, как ожидать, что это будет массив, не помечая его, так как иначе вы бы никогда не узнали с одним элементом «массив».
Маркус
Например, есть элемент под названием «номера телефонов». И есть 1 или более элементов «номер телефона» в элементе «номер телефона». Поэтому, когда в «phonenumbers» есть только один элемент «phonenumber», xml2json создает объект phonenumber, но я создаю массив phonenumber и помещаю в него объект phonenumber.
kommradHomer
2

Я нашел это быстрый и простой способ: Используется: org.json.XMLкласс из java-json.jar

if (statusCode == 200 && inputStream != null) {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    StringBuilder responseStrBuilder = new StringBuilder();

    String inputStr;
    while ((inputStr = bufferedReader.readLine()) != null) {
        responseStrBuilder.append(inputStr);
    }

    jsonObject = XML.toJSONObject(responseStrBuilder.toString());
}
horizon7
источник
1

Я не знаю, в чем именно ваша проблема, но если вы получаете XML и хотите вернуть JSON (или что-то еще), вы также можете посмотреть на JAX-B. Это стандарт для маршаллинга / демаршаллинга Java POJO в XML и / или Json. Есть несколько библиотек, которые реализуют JAX-B, например Cache Apache.

Мартин Штурм
источник