วิธีที่เร็วที่สุดในการแปลง XML เป็น JSON ใน Java [ปิด]


171

เครื่องมือที่ดีสำหรับการแปลง XML เป็น JSON ใน Java อย่างรวดเร็วและง่ายดายคืออะไร


ฉันไม่สามารถใช้ XML โดยตรงเนื่องจากความต้องการในสเป็ค แต่ฉันเห็นด้วยกับคุณ ขอบคุณ!
BeachRunnerFred

@BeachRunnerJoe: ฉันต้องนำเข้าอะไรในการเขียน หรือimport net.sf.json.JSONObject; import org.json.JSONObject;นอกจากนี้ฉันต้องใส่กระปุกใดด้วย
Fahim Parkar

1
นี่คือลิงก์ไปยังวิธีดำเนินการโดยไม่มีการอ้างอิงโดยใช้ JAXP: stackoverflow.com/questions/27222992/…
bvdb

16
ฉันชอบคำถามแบบปิดของ SO ที่มีทัศนวิสัยสูงมาก ... มีบางอย่างผิดปกติที่ใดที่หนึ่งหากคำถามที่มีประโยชน์ดังกล่าวถูกปิด
Dariusz

2
ฉันคิดว่า 90% ของคำถามที่มีประโยชน์ที่สุดคือ "หัวข้อ Closed-off" .. smh
Jeryl Cook

คำตอบ:


188

JSON ใน Javaมีทรัพยากรที่ยอดเยี่ยม

การพึ่งพา Maven:

<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!
Ludovic Landry

2
@danieltalsky: ฉันต้องนำเข้าอะไรในการเขียน หรือimport net.sf.json.JSONObject; import org.json.JSONObject;นอกจากนี้ฉันต้องใส่กระปุกใดด้วย
Fahim Parkar

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 ได้อย่างถูกต้อง
Agoston Horvath

58

ในการแปลงไฟล์ XML เป็น JSON ให้รวมการพึ่งพาต่อไปนี้

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

และคุณสามารถดาวน์โหลดโหลจาก Maven พื้นที่เก็บข้อมูลที่นี่ จากนั้นใช้เป็น:

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

5
+ สำหรับการพึ่งพา Maven ที่ให้ไว้
zacheusz

2
ใช้เวอร์ชันของ json ที่กล่าวถึงในโพสต์หากคุณใช้จาวา 7 อยู่เนื่องจากเวอร์ชันล่าสุดมีข้อผิดพลาดแปลก ๆ
urug

หากคุณมีไฟล์ dtd ที่ถูกต้องสำหรับตัวอย่างข้อมูล xml คุณสามารถแปลง xml เป็น json และ json เป็น xml ได้อย่างง่ายดายโดยใช้โอเพ่นซอร์ส jar ของ eclipse ตัวอย่างรายละเอียดของโครงการ 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 ()" ซึ่งส่งกลับอาร์เรย์ด้วยวัตถุเดียวในนั้น ดังนั้นคุณสามารถไว้วางใจค่าของคุณเป็นอาร์เรย์ได้
เสมอ

ยังไม่ชัดเจนสำหรับฉันว่าวิธีแก้ปัญหาได้อย่างไร คุณเพิ่งสร้างอาร์เรย์ทุกอย่างแทนที่จะเป็นวัตถุหรือไม่? เช่นถ้าฉันมี XML <results><result><value>1</value></result></results>มันจะสร้าง { "results" : { "result" : { "value" : "1" } } } หรือ { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus

มีบางอย่างที่เราคาดว่ามันจะเป็นอาร์เรย์ ปัญหาเกิดขึ้นเมื่ออาร์เรย์นี้มีเพียง 1 องค์ประกอบทำให้มันเป็นวัตถุสำหรับตัวแปลง xml-to-json ดังนั้นในขณะที่เราคาดว่าสิ่งนี้จะเป็นอาร์เรย์สำหรับแม้แต่องค์ประกอบเดียวเราตรวจสอบและแปลงเป็นอาร์เรย์เพื่อให้แน่ใจว่าเรามีอาร์เรย์ที่เราคาดหวังอาร์เรย์
kommradHomer

แต่คุณจะคาดหวังให้องค์ประกอบที่เฉพาะเจาะจงเป็นอาร์เรย์ได้อย่างไร XML2JSON แท็กองค์ประกอบ ยังไม่ชัดเจนว่าจะคาดหวังว่ามันจะเป็นอาร์เรย์ได้อย่างไรโดยไม่ต้องติดแท็กมัน
Marcus

ตัวอย่างเช่นมีองค์ประกอบที่เรียกว่า "phonenumbers" และมีองค์ประกอบ "phonenumber" 1 รายการขึ้นไปในองค์ประกอบ "phonenumber" ดังนั้นเมื่อมีองค์ประกอบ "phonenumber" เพียงหนึ่งใน "phonenumber" xml2json สร้างวัตถุ phonenumber แต่ฉันสร้างอาร์เรย์ phonenumber และวางวัตถุ phonenumber ไว้ในนั้น
kommradHomer


2

ฉันพบสิ่งนี้เป็นวิธีที่ง่ายและรวดเร็ว: ใช้แล้ว: org.json.XMLclass จาก 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 ได้เช่นกัน นี่เป็นมาตรฐานสำหรับ marshalling / unmarshalling Java POJO ของ XML และ / หรือ Json มีหลายไลบรารีที่ใช้ JAX-B ตัวอย่างเช่น CXF ของ Apache

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.