Cách nhanh nhất để chuyển đổi XML sang JSON trong Java [đã đóng]


171

Một số công cụ tốt để chuyển đổi XML sang JSON nhanh chóng và dễ dàng là gì?


Tôi không thể sử dụng XML trực tiếp do một yêu cầu trong thông số kỹ thuật, nhưng tôi đồng ý với bạn. cảm ơn!
BeachRunnerFred

@BeachRunnerJoe: Tôi cần viết gì? import net.sf.json.JSONObject;hoặc import org.json.JSONObject;. Ngoài ra tôi cần bao gồm bình nào?
Fahim Parkar

1
Đây là một liên kết đến một cách để làm điều đó mà không có bất kỳ sự phụ thuộc nào, sử dụng JAXP: stackoverflow.com/questions/27222992/iêu
bvdb

16
Tôi yêu các câu hỏi đóng của SO có tầm nhìn rất cao ... Đã xảy ra lỗi ở đâu đó nếu một câu hỏi hữu ích như vậy bị đóng lại.
Dariusz

2
tôi nghĩ 90% câu hỏi hữu ích nhất là "Chủ đề đóng" .. smh
Jeryl Cook

Câu trả lời:


188

JSON trong Java có một số tài nguyên tuyệt vời.

Phụ thuộc Maven:

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

XML.java là lớp bạn đang tìm kiếm:

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

Đầu ra là:

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

14
Cảnh báo: Gói json.org.XML không tồn tại trong Android!
Ludovic Landry

2
@danieltalsky: Tôi cần viết gì? import net.sf.json.JSONObject;hoặc import org.json.JSONObject;. Ngoài ra tôi cần bao gồm bình nào?
Fahim Parkar

2
tải xuống tất cả các tệp không chỉ XML.java. Từ đây: github.com/douglascrockford/JSON-java/doads
Spiff

4
Nếu bạn có một <test attrib="moretest" content="foo">bar</test>?
wchargein

1
LƯU Ý: org.sonJ.OJO
Agoston Horvath

58

Để chuyển đổi tệp XML thành JSON bao gồm các phụ thuộc sau

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

và bạn có thể Tải xuống Jar từ Kho lưu trữ Maven tại đây . Sau đó thực hiện như:

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

5
+ cho phụ thuộc maven được cung cấp
zacheusz

2
sử dụng phiên bản của json được đề cập trong bài đăng nếu bạn đang sử dụng java 7 vì phiên bản mới nhất sẽ xuất hiện các lỗi lạ.
urug

Nếu bạn có tệp dtd hợp lệ cho đoạn mã xml, thì bạn có thể dễ dàng chuyển đổi xml thành json và json thành xml bằng cách sử dụng tệp liên kết nhật thực mã nguồn mở. Dự án JAVA mẫu chi tiết có thể được tìm thấy ở đây: cubrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia

Tôi đã phải sao chép toàn bộ gói JSON vào dự án của mình và đổi tên gói. Việc thêm vào lớp sẽ đưa ra cảnh báo về gói trùng lặp từ Android trong quá trình xây dựng.
codelearner

28

Vấn đề duy nhất với JSON trong Java là nếu XML của bạn có một con duy nhất, nhưng là một mảng, nó sẽ chuyển đổi nó thành một đối tượng thay vì một mảng. Điều này có thể gây ra sự cố nếu bạn luôn tự động chuyển đổi từ XML sang JSON, trong đó nếu ví dụ XML của bạn chỉ có một phần tử, bạn trả về một đối tượng, nhưng nếu nó có 2+, bạn trả về một mảng, có thể gây ra sự cố phân tích cú pháp cho những người sử dụng JSON.

Lớp XML2JSON của Infoscoop có cách gắn thẻ các phần tử là mảng trước khi thực hiện chuyển đổi, để các mảng có thể được ánh xạ chính xác, ngay cả khi chỉ có một con trong XML.

Dưới đây là một ví dụ về việc sử dụng nó (trong một ngôn ngữ hơi khác, nhưng bạn cũng có thể thấy cách các mảng được sử dụng từ phương thức gật đầu2json () của liên kết XML2JSON).


chúng tôi đang sử dụng thư viện "xml-to-json" trong python và đây là một vấn đề ngữ nghĩa. Những gì chúng ta làm để giải quyết vấn đề "mảng hoặc đối tượng" này, là viết một phương thức "tryConvertToArray ()", trả về một mảng với một đối tượng duy nhất trong đó. Vì vậy, bạn luôn có thể tin tưởng giá trị của mình là một mảng
kommradHomer

Tôi không rõ điều đó giải quyết vấn đề như thế nào. Bạn chỉ làm mọi thứ thành một mảng thay vì một đối tượng sau đó? Ví dụ: nếu tôi có XML <results><result><value>1</value></result></results>, nó sẽ tạo { "results" : { "result" : { "value" : "1" } } } hoặc { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus

Có một cái gì đó mà chúng tôi mong đợi nó là một mảng. Vấn đề phát sinh khi mảng này chỉ có 1 phần tử, làm cho nó trở thành một đối tượng cho trình chuyển đổi xml-to-json. Vì vậy, vì chúng tôi hy vọng đây sẽ là một mảng cho một phần tử duy nhất, chúng tôi kiểm tra và chuyển đổi nó thành một mảng, đảm bảo rằng chúng tôi có một mảng nơi chúng tôi mong đợi một mảng.
kommradHomer

Nhưng làm thế nào để bạn mong đợi một yếu tố cụ thể là một mảng? XML2JSON gắn thẻ các phần tử. Không rõ làm thế nào để mong đợi nó là một mảng mà không gắn thẻ nó, vì nếu không bạn sẽ không bao giờ biết với một phần tử 'mảng'.
Marcus

Ví dụ, có một yếu tố gọi là "phonenumbers". Và có 1 hoặc nhiều phần tử "phonenumber" trong phần tử "phonenumbers". Vì vậy, khi chỉ có một phần tử "phonenumber" trong "phonenumbers", xml2json tạo ra một đối tượng phonenumber, nhưng tôi tạo một mảng phonenumber và đặt đối tượng phonenumber vào đó.
kommradHomer


2

Tôi thấy đây là cách nhanh chóng và dễ dàng: Được sử dụng: org.json.XMLlớp từ 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

Tôi không biết vấn đề chính xác của bạn là gì, nhưng nếu bạn đang nhận XML và muốn trả lại JSON (hoặc một cái gì đó), bạn cũng có thể xem JAX-B. Đây là một tiêu chuẩn cho việc sắp xếp / sắp xếp các Java POJO thành XML và / hoặc Json. Có nhiều thư viện triển khai JAX-B, ví dụ CXF của Apache.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.