Najszybszy sposób na konwersję XML do JSON w Javie [zamknięty]


171

Jakie są dobre narzędzia do szybkiego i łatwego konwertowania XML do JSON w Javie?


nie mogę używać XML bezpośrednio ze względu na wymagania specyfikacji, ale zgadzam się z tobą. dzięki!
— BeachRunnerFred

@BeachRunnerJoe: Jaki import muszę napisać? import net.sf.json.JSONObject;lub import org.json.JSONObject;. Który słoik muszę dołączyć?
— Fahim Parkar

1
Oto link do sposobu, aby zrobić to bez żadnych zależności, używając JAXP: stackoverflow.com/questions/27222992/ ...
— bvdb

16
Uwielbiam zamknięte pytania SO, które są tak bardzo widoczne ... Coś poszło nie tak gdzieś, jeśli tak przydatne pytanie zostało zamknięte.
— Dariusz

2
Myślę, że 90% z najbardziej użytecznych pytania są "Closed-off topic" .. SMH
— Jeryl Gotować

Odpowiedzi:


188

JSON w Javie ma świetne zasoby.

Zależność Mavena:

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

XML.java to klasa, której szukasz:

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());
        }
    }
}

Wynik to:

{"test": {
    "attrib": "moretest",
    "content": "Turn this to JSON"
}}

14
Ostrzeżenie: pakiet json.org.XML nie istnieje w systemie Android!
— Ludovic Landry,

2
@danieltalsky: Jaki import muszę napisać? import net.sf.json.JSONObject;lub import org.json.JSONObject;. Który słoik muszę dołączyć?
— Fahim Parkar

2
pobierz wszystkie pliki, a nie tylko XML.java. Stąd: github.com/douglascrockford/JSON-java/downloads
— Spiff

4
A co jeśli masz <test attrib="moretest" content="foo">bar</test>?
— wchargin

1
UWAGA: XML.toJSONObject () org.json również poprawnie konwertuje listy xml na tablice json (w przeciwieństwie do XmlMappera Jacksona, który domyślnie po cichu połyka).
— Agoston Horvath,

58

Aby przekonwertować plik XML na format JSON, należy uwzględnić następującą zależność

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

i możesz pobrać Jar z repozytorium Maven tutaj . Następnie zaimplementuj jako:

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

5
+ za zależność
— mavena

2
użyj wersji json wspomnianej w poście, jeśli korzystasz z java 7, ponieważ najnowsza wersja generuje dziwne błędy.
— urug

Jeśli masz prawidłowy plik dtd dla fragmentu kodu xml, możesz łatwo przekonwertować xml na json i json na xml za pomocą pliku jar linku eclipse open source. Szczegółowy przykładowy projekt JAVA można znaleźć tutaj: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
— Piyush Chordia

Musiałem skopiować cały pakiet JSON do mojego projektu i zmienić nazwę pakietu. Dodanie do gradle daje ostrzeżenie o zduplikowanym pakiecie z Androida podczas kompilacji.
— codelearner

28

Jedyny problem z JSON w Javie polega na tym, że jeśli twój XML ma jedno dziecko, ale jest tablicą, przekonwertuje go na obiekt zamiast tablicy. Może to powodować problemy, jeśli zawsze dynamicznie konwertujesz z XML do JSON, gdzie jeśli przykładowy XML ma tylko jeden element, zwracasz obiekt, ale jeśli ma 2+, zwracasz tablicę, co może powodować problemy z analizowaniem dla osób używających funkcji JSON.

Klasa XML2JSON firmy Infoscoop umożliwia oznaczanie elementów, które są tablicami przed wykonaniem konwersji, dzięki czemu tablice mogą być poprawnie odwzorowane, nawet jeśli w XML jest tylko jedno dziecko.

Oto przykład jego użycia (w nieco innym języku, ale możesz również zobaczyć, jak używane są tablice z metody nodelist2json () linku XML2JSON).


używamy biblioteki „xml-to-json” w Pythonie i jest to problem semantyczny. Aby rozwiązać ten problem „tablica lub obiekt”, piszemy metodę „tryConvertToArray ()”, która zwraca tablicę zawierającą pojedynczy obiekt. Więc zawsze możesz ufać swojej wartości jako tablicy
— kommradHomer

Nie jest dla mnie jasne, jak to rozwiązuje problem. Czy po prostu uczynisz wszystko tablicą zamiast obiektem? Np. Jeśli mam XML <results><result><value>1</value></result></results>, czy wygeneruje { "results" : { "result" : { "value" : "1" } } } lub { "results" : [ { "result" : { "value" : "1" } } ] }
— Marcus

Jest coś, czego oczekujemy, że będzie to tablica. Problem pojawia się, gdy ta tablica ma tylko 1 element, co czyni ją obiektem dla konwertera xml-to-json. Tak więc, ponieważ spodziewamy się, że będzie to tablica nawet dla pojedynczego elementu, sprawdzamy i konwertujemy ją na tablicę, upewniając się, że mamy tablicę, w której oczekujemy tablicy.
— kommradHomer

Ale jak można się spodziewać, że określony element będzie tablicą? XML2JSON oznacza elementy. Nie jest jasne, jak oczekiwać, że będzie to tablica bez oznaczania jej tagami, ponieważ w przeciwnym razie nigdy nie wiedziałbyś o pojedynczym elemencie „tablica”.
— Marcus

Na przykład istnieje element o nazwie „phonenumbers”. W elemencie „phonenumbers” znajduje się co najmniej jeden element „phonenumber”. Tak więc, gdy istnieje tylko jeden element „phonenumber” w „phonenumbers”, xml2json tworzy obiekt phonenumber, ale tworzę tablicę phonenumber i umieszczam w niej obiekt phonenumber.
— kommradHomer


2

Znalazłem to w szybki i łatwy sposób: Używany: org.json.XMLklasa z 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

Nie wiem, jaki jest twój dokładny problem, ale jeśli otrzymujesz XML i chcesz zwrócić JSON (lub coś takiego), możesz również spojrzeć na JAX-B. Jest to standard krosowania / cofania kodu POJO Java do XML i / lub Json. Istnieje wiele bibliotek, które implementują JAX-B, na przykład CXF Apache.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.