XML'yi Java'da JSON'a dönüştürmenin en hızlı yolu [kapalı]


171

Java'da XML'yi hızlı ve kolay bir şekilde JSON'a dönüştürmek için bazı iyi araçlar nelerdir?


Ben şartname bir gereksinimi nedeniyle doğrudan XML kullanamazsınız, ama size katılıyorum. Teşekkürler!
BeachRunnerFred

@BeachRunnerJoe: Ne tür bir ithalat yazmam gerekiyor? import net.sf.json.JSONObject;veya import org.json.JSONObject;. Ayrıca hangi kavanozu eklemem gerekiyor?
Fahim Parkar

1
İşte JAXP kullanarak herhangi bir bağımlılık olmadan bunu yapmanın bir yolu: stackoverflow.com/questions/27222992/…
bvdb

16
SO'nun çok yüksek görünürlüklü kapalı sorularını seviyorum ... Böyle yararlı bir soru kapatılırsa bir şeyler ters gitti.
Dariusz

2
en yararlı soruların% 90'ı "Kapalı konu" olduğunu düşünüyorum .. smh
Jeryl Cook

Yanıtlar:


188

Java'daki JSON'un bazı harika kaynakları vardır.

Maven bağımlılığı:

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

XML.java aradığınız sınıf:

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

Çıktı:

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

14
Uyarı: json.org.XML paketi Android'de mevcut değil!
Ludovic Landry

2
@danieltalsky: Ne tür bir ithalat yazmam gerekiyor? import net.sf.json.JSONObject;veya import org.json.JSONObject;. Ayrıca hangi kavanozu eklemem gerekiyor?
Fahim Parkar

2
sadece XML.java değil tüm dosyaları indirin. Buradan: github.com/douglascrockford/JSON-java/downloads
Spiff

4
Ya sahipseniz <test attrib="moretest" content="foo">bar</test>?
wchargin

1
NOT: org.json'ın XML.toJSONObject () yöntemi, xml listelerini json dizilerine doğru bir şekilde dönüştürür (varsayılan olarak sessizce yutan jackson'un XmlMapper öğesinin aksine).
Agoston Horvath

58

XML Dosyasını JSON'a dönüştürmek için aşağıdaki bağımlılığı ekleyin

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

buradan Jar'ı Maven Deposundan indirebilirsiniz . Sonra şu şekilde uygulayın:

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

5
bağımlılığı için sağlanan +
zacheusz

2
java 7 kullanıyorsanız son sürüm garip hatalar atar gibi sonrası json sürümünü kullanın.
urug

Xml snippet'i için geçerli bir dtd dosyanız varsa, açık kaynak tutulması bağlantı kavanozunu kullanarak xml'yi json ve json'a xml'ye kolayca dönüştürebilirsiniz. Detaylı örnek JAVA projesi burada bulunabilir: cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia

Tüm JSON paketini projeme kopyalamak zorunda kaldım ve paketi yeniden adlandırdım. Gradle'a ekleme, derleme sırasında Android'den yinelenen paket uyarısı verir.
codelearner

28

Java'daki JSON ile ilgili tek sorun, XML'nizin tek bir alt öğesi varsa, ancak bir dizi ise, onu bir dizi yerine bir nesneye dönüştürmesidir. Bu, dinamik olarak her zaman XML'den JSON'a dönüştürdüğünüzde sorunlara neden olabilir; burada, örnek XML'nizde yalnızca bir öğe varsa, bir nesneyi döndürürsünüz, ancak 2+ varsa, bir diziyi döndürür ve bu da JSON.

Infoscoop'un XML2JSON sınıfı, dönüştürme işleminden önce diziler olan öğeleri etiketleme yoluna sahiptir, böylece XML'de yalnızca bir çocuk olsa bile diziler düzgün bir şekilde eşlenebilir.

İşte bunun bir örneği (biraz farklı bir dilde, ancak XML2JSON bağlantısının nodelist2json () yönteminden dizilerin nasıl kullanıldığını da görebilirsiniz).


python'da "xml-to-json" kütüphanesi kullanıyoruz ve bu semantik bir problem. Bu "dizi veya nesne" sorununu çözmek için yaptığımız, içinde tek bir nesne bulunan bir dizi döndüren bir "tryConvertToArray ()" yöntemi yazmaktır. Böylece, her zaman değerinizin bir dizi olacağına güvenebilirsiniz
kommradHomer

Bunun sorunu nasıl çözdüğü açık değil. O zaman her şeyi bir nesne yerine bir dizi haline getiriyor musunuz? Örneğin, XML'im varsa <results><result><value>1</value></result></results>, oluşturur mu { "results" : { "result" : { "value" : "1" } } } yoksa { "results" : [ { "result" : { "value" : "1" } } ] }
Marcus

Bir dizi olmasını beklediğimiz bir şey var. Sorun, bu dizinin yalnızca 1 öğesi olduğunda ortaya çıkar ve xml-json dönüştürücüsü için bir nesne yapar. Bu nedenle, bunun tek bir öğe için bile bir dizi olmasını beklediğimizden, bir dizi beklediğimiz bir diziye sahip olduğumuzdan emin olarak onu kontrol edip bir diziye dönüştürüyoruz.
kommradHomer

Ancak belirli bir öğenin dizi olmasını nasıl beklersiniz? XML2JSON öğeleri etiketler. Etiketlemeden bir dizi olmasını nasıl beklediğiniz açık değildir, aksi takdirde tek bir 'dizi' öğesini asla bilemezsiniz.
Marcus

Örneğin, "telefon numaraları" adı verilen bir öğe vardır. Ve "telefon numaraları" öğesinde 1 veya daha fazla "telefon numarası" öğesi var. Yani "telefon numaralarında" yalnızca bir "telefon numarası" öğesi olduğunda, xml2json bir telefon numarası nesnesi oluşturur, ancak ben bir telefon numarası dizisi oluşturur ve telefon numarası nesnesini içine koyarım.
kommradHomer


2

Bunu hızlı ve kolay bir şekilde buldum: Kullanılmış: org.json.XMLclass from 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

Sorununuzun tam olarak ne olduğunu bilmiyorum, ancak XML alıyorsanız ve JSON (veya bir şey) döndürmek istiyorsanız, JAX-B'ye de bakabilirsiniz. Bu, Java POJO'ları XML ve / veya Json ile paylaşma / paylaşma standardıdır. JAX-B'yi uygulayan birden fazla kütüphane vardır, örneğin Apache'nin CXF'si.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.