web-dev-qa-db-fra.com

Convertir xml en json avec Java

Existe-t-il un moyen de convertir un fichier XML en json? Le XML peut être de n'importe quelle structure, il n'y a donc pas de classe POJO pour l'instanciation. J'ai besoin de convertir le xml en json ou en une carte, sans nœuds racine.

Par exemple:

<import name="person">
    <item>
        <firstName>Emil</firstName>
        <lastName>Example</lastName>
        <addresses>
            <address>
                <street>Example Blvd.</street>
            </address>
            <address>
                <street>Example Ave.</street>
            </address>
        </addresses>
    </item>
</import>

JSON attendu

{
    "firstName": "Emil",
    "lastName": "Example",
    "addresses": [
        { "street" : "Example Blvd." },
        { "street" : "Example Ave." }
    ]
}
8
Dominic
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;

XML.toJSONObject(xml_text).toString()

org.json.XML

15
Konstantin.Krivyakin

Vous pouvez utiliser les bibliothèques JSON et XML à partir de json.org

import org.json.JSONObject;
import org.json.XML;
import org.junit.Test;

public class XmlToJsonTest {
    private static final String XML_TEXT = "<note>\n" +
            "<to>Tove</to>\n" +
            "<from>Jani</from>\n" +
            "<heading>Reminder</heading>\n" +
            "<body>Don't forget me this weekend!</body>\n" +
            "</note>";
    private static final int PRETTY_PRINT_INDENT_FACTOR = 4;

    @Test
    public void convert() {
        JSONObject xmlJSONObj = XML.toJSONObject(XML_TEXT);
        String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
        System.out.println(jsonPrettyPrintString);
    }
}

La source

<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

Sortie

{"note": {
    "heading": "Reminder",
    "from": "Jani",
    "to": "Tove",
    "body": "Don't forget me this weekend!"
}}
8
Adi Sembiring

Si vous utilisez Java 8, vous devriez consulter ma bibliothèque open source: unXml . UnXML mappe fondamentalement de Xpaths aux attributs Json.

Il est disponible sur Maven Central .

Exemple

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.nerdforge.unxml.factory.ParsingFactory;
import com.nerdforge.unxml.parsers.Parser;
import org.w3c.dom.Document;

public class ParserExample {
    public ObjectNode parseXml(String xml){
        Parsing parsing = ParsingFactory.getInstance().create();
        Document document = parsing.xml().document(xml);

        Parser<ObjectNode> parser = parsing.obj("//item")
            .attribute("firstName", "firstName")
            .attribute("lastName", "lastName")
            .attribute("addresses", parsing.arr("addresses/address", parsing.obj()
                .attribute("street", "street")
            ))
            .build();

        ObjectNode result = parser.apply(document);
        return result;
    }
}

Il retournera un JacksonObjectNode, avec le json de votre exemple.

3
tomaj

Sur ce site Web vous trouvez des cours utiles pour votre tâche.

public class Main {

    public static int PRETTY_PRINT_INDENT_FACTOR = 4;
    public static String TEST_XML_STRING = "Your xml string here";

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

Je suis utilisé JSON-Java mais j'ai trouvé une bibliothèque plus efficace pour convertir XML en Json est XmlToJson

Quelle est la meilleure personnalisation pour rendre Json à partir de XML

Ajoutez la dépendance libary à votre fichier APP build.gradle

dependencies {
compile 'com.github.smart-fun:XmlToJson:1.4.4'    // add this line
}

    <?xml version="1.0" encoding="utf-8"?>
    <library>
    <book id="007">James Bond</book>
    <book id="000">Book for the dummies</book>
    </library>
  • Noms de contenu personnalisés

    public String convertXmlToJson(String xml) {
    XmlToJson xmlToJson = new XmlToJson.Builder(xml)
        .setContentName("/library/book", "title")
        .build();
    return xmlToJson.toString();
    }
    

    "library":{  
      "book":[  
         {  
            "id":"007",
            "title":"James Bond"
         },
         {  
            "id":"000",
            "title":"Book for the dummies"
         }
       ]
      }
     }
    

  • Noms d'attributs personnalisés

    public String convertXmlToJson(String xml) {
      XmlToJson xmlToJson = new XmlToJson.Builder(xml)
        .setAttributeName("/library/book/id", "code")
        .build();
      return xmlToJson.toString();
    }
    

    {  
      "library":{  
      "book":[  
         {  
            "code":"007",
            "content":"James Bond"
         },
         {  
            "code":"000",
            "content":"Book for the dummies"
         }
      ]
     }
    }
    

et beaucoup plus efficaces Techniques pour personnaliser votre Json

Cliquez ici pour vérifier sur Github

1
Nikunj Paradva

Vous pouvez utiliser les outils standard pour cela

  1. Utilisez l'outil xjc de votre jdk pour générer des classes Java à partir de schema

    Depuis Java 9, vous devez utiliser explicitement ajouter JAXB en tant que module avec –add-modules Java.se.ee Voir: Comment résoudre Java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException en Java 9

Depuis Java 11, vous devez télécharger xjc dans une étape supplémentaire à partir de https://javaee.github.io/jaxb-v2/

  1. Lire dans XML écrire comme JSON en utilisant Jackson

Exemple

Avec https://schema.datacite.org/meta/kernel-4.1/metadata.xsd

1. Utilisez l'outil xjc de votre jdk

Dans mon exemple, je vais utiliser un exemple assez complexe basé sur des schémas datacite.

/path/to/jdk/bin/xjc -d /path/to/Java/project \
-p stack24174963.datacite \
 https://schema.datacite.org/meta/kernel-4.1/metadata.xsd

Cela répondra avec

parsing a schema...
compiling a schema...
stack24174963/datacite/Box.Java
stack24174963/datacite/ContributorType.Java
stack24174963/datacite/DateType.Java
stack24174963/datacite/DescriptionType.Java
stack24174963/datacite/FunderIdentifierType.Java
stack24174963/datacite/NameType.Java
stack24174963/datacite/ObjectFactory.Java
stack24174963/datacite/Point.Java
stack24174963/datacite/RelatedIdentifierType.Java
stack24174963/datacite/RelationType.Java
stack24174963/datacite/Resource.Java
stack24174963/datacite/ResourceType.Java
stack24174963/datacite/TitleType.Java
stack24174963/datacite/package-info.Java

2. Lire comme XML écrire comme JSON en utilisant Jackson

  import com.fasterxml.jackson.databind.ObjectMapper;
  import com.fasterxml.jackson.databind.SerializationFeature;

  import stack24174963.datacite.Resource;

  public class HowToXmlToJsonWithSchema {
    @Test
    public void readXmlAndConvertToSchema() throws Exception {
        String example = "schemas/datacite/kernel-4.1/example/datacite-example-complicated-v4.1.xml";
        try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(example)) {
            Resource resource = JAXB.unmarshal(in, Resource.class);
            System.out.println(asJson(resource));
        }
    }

    private String asJson(Object obj) throws Exception {
        StringWriter w = new StringWriter();
        new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writeValue(w, obj);
        String result = w.toString();
        return result;
    }
  }

Impressions:

 {
      "identifier" : {
        "value" : "10.5072/testpub",
        "identifierType" : "DOI"
      },
      "creators" : {
        "creator" : [ {
          "creatorName" : {
            "value" : "Smith, John",
            "nameType" : "PERSONAL"
          },
          "givenName" : "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<givenName xmlns=\"http://datacite.org/schema/kernel-4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">John</givenName>",
          "familyName" : "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<familyName xmlns=\"http://datacite.org/schema/kernel-4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Smith</familyName>",
          "nameIdentifier" : [ ],
          "affiliation" : [ ]
        }, {
          "creatorName" : {
            "value" : "つまらないものですが",
            "nameType" : null
          },
          "givenName" : null,
          "familyName" : null,
          "nameIdentifier" : [ {
            "value" : "0000000134596520",
            "nameIdentifierScheme" : "ISNI",
            "schemeURI" : "http://isni.org/isni/"
          } ],
          "affiliation" : [ ]
        } ]
      },
      "titles" : {
        "title" : [ {
          "value" : "Właściwości rzutowań podprzestrzeniowych",
          "titleType" : null,
          "lang" : "pl"
        }, {
          "value" : "Translation of Polish titles",
          "titleType" : "TRANSLATED_TITLE",
          "lang" : "en"
        } ]
      },
      "publisher" : "Springer",
      "publicationYear" : "2010",
      "resourceType" : {
        "value" : "Monograph",
        "resourceTypeGeneral" : "TEXT"
      },
      "subjects" : {
        "subject" : [ {
          "value" : "830 German & related literatures",
          "subjectScheme" : "DDC",
          "schemeURI" : null,
          "valueURI" : null,
          "lang" : "en"
        }, {
          "value" : "Polish Literature",
          "subjectScheme" : null,
          "schemeURI" : null,
          "valueURI" : null,
          "lang" : "en"
        } ]
      },
      "contributors" : {
        "contributor" : [ {
          "contributorName" : {
            "value" : "Doe, John",
            "nameType" : "PERSONAL"
          },
          "givenName" : "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<givenName xmlns=\"http://datacite.org/schema/kernel-4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">John</givenName>",
          "familyName" : "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<familyName xmlns=\"http://datacite.org/schema/kernel-4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Doe</familyName>",
          "nameIdentifier" : [ {
            "value" : "0000-0001-5393-1421",
            "nameIdentifierScheme" : "ORCID",
            "schemeURI" : "http://orcid.org/"
          } ],
          "affiliation" : [ ],
          "contributorType" : "DATA_COLLECTOR"
        } ]
      },
      "dates" : null,
      "language" : "de",
      "alternateIdentifiers" : {
        "alternateIdentifier" : [ {
          "value" : "937-0-4523-12357-6",
          "alternateIdentifierType" : "ISBN"
        } ]
      },
      "relatedIdentifiers" : {
        "relatedIdentifier" : [ {
          "value" : "10.5272/oldertestpub",
          "resourceTypeGeneral" : null,
          "relatedIdentifierType" : "DOI",
          "relationType" : "IS_PART_OF",
          "relatedMetadataScheme" : null,
          "schemeURI" : null,
          "schemeType" : null
        } ]
      },
      "sizes" : {
        "size" : [ "256 pages" ]
      },
      "formats" : {
        "format" : [ "pdf" ]
      },
      "version" : "2",
      "rightsList" : {
        "rights" : [ {
          "value" : "Creative Commons Attribution-NoDerivs 2.0 Generic",
          "rightsURI" : "http://creativecommons.org/licenses/by-nd/2.0/",
          "lang" : null
        } ]
      },
      "descriptions" : {
        "description" : [ {
          "content" : [ "\n      Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\n      takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores\n      et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n    " ],
          "descriptionType" : "ABSTRACT",
          "lang" : "la"
        } ]
      },
      "geoLocations" : null,
      "fundingReferences" : null
    }

Par exemple, entrée XML:

  <?xml version="1.0" encoding="UTF-8"?>
  <resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://datacite.org/schema/kernel-4" xsi:schemaLocation="http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.1/metadata.xsd">
    <identifier identifierType="DOI">10.5072/testpub</identifier>
    <creators>
      <creator>
        <creatorName nameType="Personal">Smith, John</creatorName>
        <givenName>John</givenName>
        <familyName>Smith</familyName>
      </creator>
      <creator>
        <creatorName>つまらないものですが</creatorName>
        <nameIdentifier nameIdentifierScheme="ISNI" schemeURI="http://isni.org/isni/">0000000134596520</nameIdentifier>
      </creator>
    </creators>
    <titles>
      <title xml:lang="pl">Właściwości rzutowań podprzestrzeniowych</title>
      <title xml:lang="en" titleType="TranslatedTitle">Translation of Polish titles</title>
    </titles>
    <publisher>Springer</publisher>
    <publicationYear>2010</publicationYear>
    <subjects>
      <subject xml:lang="en" subjectScheme="DDC">830 German &amp; related literatures</subject>
      <subject xml:lang="en">Polish Literature</subject>
    </subjects>
    <contributors>
      <contributor contributorType="DataCollector">
        <contributorName nameType="Personal">Doe, John</contributorName>
        <givenName>John</givenName>
        <familyName>Doe</familyName>
        <nameIdentifier nameIdentifierScheme="ORCID" schemeURI="http://orcid.org/">0000-0001-5393-1421</nameIdentifier>
      </contributor>
    </contributors>
    <language>de</language>
    <resourceType resourceTypeGeneral="Text">Monograph</resourceType>
    <alternateIdentifiers>
      <alternateIdentifier alternateIdentifierType="ISBN">937-0-4523-12357-6</alternateIdentifier>
    </alternateIdentifiers>
    <relatedIdentifiers>
      <relatedIdentifier relatedIdentifierType="DOI" relationType="IsPartOf">10.5272/oldertestpub</relatedIdentifier>
    </relatedIdentifiers>
    <sizes>
      <size>256 pages</size>
    </sizes>
    <formats>
      <format>pdf</format>
    </formats>
    <version>2</version>
    <rightsList>
      <rights rightsURI="http://creativecommons.org/licenses/by-nd/2.0/">Creative Commons Attribution-NoDerivs 2.0 Generic</rights>
    </rightsList>
    <descriptions>
      <description xml:lang="la" descriptionType="Abstract">
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
        takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
        et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
      </description>
    </descriptions>
  </resource>
0
jschnasse

Underscore-Java library a la méthode statique xmlToJson. Je suis le mainteneur du projet. Exemple live

import com.github.underscore.lodash.U;

public class Main {
    public static void main(String[] args) {
        final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n"
            + "  <FirstItem>1</FirstItem>\n  <SecondItem>2</SecondItem>\n</root>";
        System.out.println(U.xmlToJson(xml));
    }
}
0