Найшвидший спосіб перетворення XML в JSON в Java [закрито]


171

Які хороші інструменти для швидкого та простого перетворення XML в JSON на Java?


я не можу використовувати XML безпосередньо через вимогу в специфікації, але я згоден з вами. Дякую!
BeachRunnerFred

@BeachRunnerJoe: Який імпорт мені потрібно написати? import net.sf.json.JSONObject;або import org.json.JSONObject;. Також яку банку потрібно включити?
Фахім Паркар

1
Ось посилання на спосіб зробити це без будь - яких залежностей, використовуючи JAXP: stackoverflow.com/questions/27222992 / ...
bvdb

16
Я люблю закриті питання SO, які мають таку дуже високу видимість ... Десь щось пішло не так, якщо таке корисне питання було закрите.
Даріуш

2
я думаю, що 90% найкорисніших запитань - це "Закрита тема". smh
Cook

Відповіді:


188

JSON на Java має чудові ресурси.

Залежна залежність:

<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"
}}

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 jackson, який за замовчуванням мовчки проковтує).
Агостон Хорват

58

Для перетворення XML-файлу в JSON включайте наступну залежність

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

і ви можете завантажити Jar з Maven Repository тут . Потім реалізуйте як:

String soapmessageString = "<xml>yourStringURLorFILE</xml>";
JSONObject soapDatainJsonObject = XML.toJSONObject(soapmessageString);
System.out.println(soapDatainJsonObject);

5
+ для мавенської залежності передбачено
зачеуш

2
використовуйте версію json, згадану в публікації, якщо ви перебуваєте на Java 7, оскільки остання версія призводить до дивних помилок.
урв

Якщо у вас є дійсний файл dtd для фрагмента xml, ви можете легко конвертувати xml у json та json в xml, використовуючи відкритий джерело посилання затемнення. Детальний зразок проекту JAVA можна знайти тут: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia

Мені довелося скопіювати весь пакет 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" } } ] }
Marcus

Є щось, що ми очікуємо, що це масив. Проблема виникає, коли цей масив містить лише 1 елемент, що робить його об'єктом для конвертора xml-to-json. Отже, оскільки ми очікуємо, що це буде масив навіть для одного елемента, ми перевіряємо і перетворюємо його в масив, переконуючись, що у нас є масив, де ми очікуємо масив.
kommradHomer

Але як ви розраховуєте, що конкретний елемент буде масивом? XML2JSON тегує елементи. Незрозуміло, як очікувати, що це масив, не позначаючи його, оскільки в іншому випадку ви ніколи не дізнаєтесь з одним елементом 'масив'.
Маркус

Наприклад, є елемент, який називається "телефонні номери". І в елементі "phonenumbers" є 1 або більше елементів "phonenumber". Отже, коли в "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());
}

1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.