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?

BeachRunnerFred
źródło
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"
}}
danieltalsky
źródło
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);
Kishan Bheemajiyani
źródło
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).

Marcus
źródło
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());
}
horyzont 7
źródło
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.

Martin Sturm
źródło