Cara tercepat untuk mengonversi XML ke JSON di Java [ditutup]

171

Apa sajakah alat yang bagus untuk mengkonversi XML ke JSON dengan cepat dan mudah di Jawa?

BeachRunnerFred
sumber
saya tidak dapat menggunakan XML secara langsung karena persyaratan dalam spesifikasi, tetapi saya setuju dengan Anda. Terima kasih!
BeachRunnerFred
@BeachRunnerJoe: Impor apa yang perlu saya tulis? import net.sf.json.JSONObject;atau import org.json.JSONObject;. Juga stoples mana yang harus saya sertakan?
Fahim Parkar
1
Berikut tautan ke cara untuk melakukannya tanpa dependensi, menggunakan JAXP: stackoverflow.com/questions/27222992/…
bvdb
16
Saya suka pertanyaan tertutup SO yang memiliki visibilitas sangat tinggi ... Ada yang salah di suatu tempat jika pertanyaan yang bermanfaat ditutup.
Dariusz
2
saya pikir 90% dari pertanyaan yang paling berguna adalah "Topik tertutup" .. smh
Jeryl Cook

Jawaban:

188

JSON di Jawa memiliki beberapa sumber yang bagus.

Ketergantungan maven:

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

XML.java adalah kelas yang Anda cari:

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

Output adalah:

{"test": {
    "attrib": "moretest",
    "content": "Turn this to JSON"
}}
danieltalsky
sumber
14
Peringatan: Paket json.org.XML tidak ada di Android!
Ludovic Landry
2
@danieltalsky: Impor apa yang harus saya tulis? import net.sf.json.JSONObject;atau import org.json.JSONObject;. Juga stoples mana yang harus saya sertakan?
Fahim Parkar
2
unduh semua file bukan hanya XML.java. Dari sini: github.com/douglascrockford/JSON-java/downloads
spiff
4
Bagaimana jika Anda punya <test attrib="moretest" content="foo">bar</test>?
wchargin
1
CATATAN: XML.toJSONObject () milik org.json () juga dengan benar mengonversi daftar xml ke json array (tidak seperti jackml's XmlMapper yang secara default menelan dalam hati).
Agoston Horvath
58

Untuk mengonversi File XML ke JSON termasuk dependensi berikut

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

dan Anda dapat mengunduh Jar dari Maven Repository di sini . Kemudian terapkan sebagai:

String soapmessageString = "<xml>yourStringURLorFILE</xml>";
JSONObject soapDatainJsonObject = XML.toJSONObject(soapmessageString);
System.out.println(soapDatainJsonObject);
Kishan Bheemajiyani
sumber
5
+ untuk ketergantungan maven disediakan
zacheusz
2
gunakan versi json yang disebutkan dalam posting jika Anda berada di java 7 karena versi terbaru melempar kesalahan aneh.
urug
Jika Anda memiliki file dtd yang valid untuk cuplikan xml, maka Anda dapat dengan mudah mengonversi xml ke json dan json ke xml menggunakan jar tautan gerhana open source. Contoh proyek JAVA yang terperinci dapat ditemukan di sini: cubicrace.com/2015/06/Bagaimana- mengkonversi
Piyush Chordia
Saya harus menyalin seluruh paket JSON ke proyek saya dan mengganti nama paket tersebut. Menambahkan ke gradle memberi peringatan tentang paket duplikat dari Android selama pembuatan.
codelearner
28

Satu-satunya masalah dengan JSON di Jawa adalah bahwa jika XML Anda memiliki satu anak, tetapi merupakan array, itu akan mengubahnya menjadi objek, bukan array. Ini dapat menyebabkan masalah jika Anda selalu secara dinamis mengkonversi dari XML ke JSON, di mana jika contoh XML Anda hanya memiliki satu elemen, Anda mengembalikan sebuah objek, tetapi jika memiliki 2+, Anda mengembalikan array, yang dapat menyebabkan masalah penguraian bagi orang yang menggunakan JSON.

Kelas XML2JSON dari Infoscoop memiliki cara menandai elemen yang merupakan array sebelum melakukan konversi, sehingga array dapat dipetakan dengan benar, bahkan jika hanya ada satu anak dalam XML.

Berikut ini adalah contoh menggunakannya (dalam bahasa yang sedikit berbeda, tetapi Anda juga dapat melihat bagaimana array digunakan dari metode nodelist2json () pada tautan XML2JSON).

Marcus
sumber
kami menggunakan pustaka "xml-to-json" dengan python dan ini adalah masalah semantik. Apa yang kami lakukan untuk menyelesaikan masalah "array atau objek" ini adalah menulis metode "tryConvertToArray ()", yang mengembalikan array dengan objek tunggal di dalamnya. Jadi, Anda selalu dapat mempercayai nilai Anda sebagai array
kommradHomer
Tidak jelas bagi saya bagaimana cara memecahkan masalah. Apakah Anda hanya membuat semuanya menjadi array bukan objek? Misalnya, jika saya memiliki XML <results><result><value>1</value></result></results>, apakah akan menghasilkan { "results" : { "result" : { "value" : "1" } } } atau { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus
Ada sesuatu yang kami harapkan sebagai array. Masalah muncul ketika array ini hanya memiliki 1 elemen, menjadikannya objek untuk konverter xml-to-json. Jadi, seperti yang kita harapkan ini menjadi sebuah array bahkan untuk satu elemen, kita memeriksa dan mengubahnya menjadi sebuah array, memastikan kita memiliki sebuah array tempat kita mengharapkan sebuah array.
kommradHomer
Tetapi bagaimana Anda mengharapkan elemen tertentu menjadi array? XML2JSON memberi tag pada elemen. Tidak jelas bagaimana mengharapkannya menjadi array tanpa memberi tag, karena jika tidak Anda tidak akan pernah tahu dengan 'elemen' satu elemen.
Marcus
Misalnya, ada elemen yang disebut "phonenumbers". Dan ada 1 atau lebih elemen "phonenumber" dalam elemen "phonenumber". Jadi ketika hanya ada satu elemen "phonenumber" di "phonenumber", xml2json membuat objek phonenumber, tetapi saya membuat array phonenumber dan meletakkan objek phonenumber di dalamnya.
kommradHomer
2

Saya menemukan ini dengan cara cepat dan mudah: Digunakan: org.json.XMLkelas dari 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
sumber
1

Saya tidak tahu apa masalah sebenarnya Anda, tetapi jika Anda menerima XML dan ingin mengembalikan JSON (atau sesuatu), Anda juga dapat melihat JAX-B. Ini adalah standar untuk marshalling / unmarshalling POJO Java ke XML dan / atau Json. Ada beberapa pustaka yang mengimplementasikan JAX-B, misalnya Apache's CXF.

Martin Sturm
sumber