Конвертировать XML в формат JSON - PullRequest
19 голосов
/ 25 февраля 2011

Мне нужно конвертировать формат файла docx (в формате openXML) в формат JSON.Мне нужны некоторые рекомендации, чтобы сделать это.Заранее спасибо.

Ответы [ 9 ]

13 голосов
/ 25 февраля 2011

Вы можете взглянуть на библиотеку Java Json-lib , которая обеспечивает преобразование XML в JSON.

String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();  
JSON json = xmlSerializer.read( xml );  

Если вам также нужен корневой тег, просто добавьте внешний фиктивный тег:

String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();  
JSON json = xmlSerializer.read("<x>" + xml + "</x>");  
10 голосов
/ 25 февраля 2011

Нет прямого отображения между XML и JSON;XML несет информацию о типе (у каждого элемента есть имя), а также о пространстве имен.Поэтому, если каждый объект JSON не имеет встроенной информации о типе, преобразование будет с потерями.

Но это не обязательно имеет значение.Важно то, что потребитель JSON знает контракт данных.Например, учитывая этот XML:

<books>
  <book author="Jimbo Jones" title="Bar Baz">
    <summary>Foo</summary>
  </book>
  <book title="Don't Care" author="Fake Person">
    <summary>Dummy Data</summary>
  </book>
</books>

Вы можете преобразовать его в это:

{
    "books": [
        { "author": "Jimbo Jones", "title": "Bar Baz", "summary": "Foo" },
        { "author": "Fake Person", "title": "Don't Care", "summary": "Dummy Data" },
    ]
}

И потребителю не нужно будет знать, что каждый объект в коллекции booksбыл book объект.

Редактировать:

Если у вас есть XML-схема для XML и вы используете .NET, вы можете генерировать классы из этой схемы, используяxsd.exe.Затем вы можете проанализировать исходный XML-код в объектах этих классов, а затем использовать DataContractJsonSerializer для сериализации классов как JSON.

Если у вас нет схемы, будет трудно обойти ручное определениеВаш формат JSON самостоятельно.

6 голосов
/ 28 августа 2011

Если вы недовольны различными реализациями, попробуйте свернуть свои собственные. Вот код, который я написал сегодня днем, чтобы вы начали. Работает с net.sf.json и apache common-lang:

static public JSONObject readToJSON(InputStream stream) throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setNamespaceAware(true);
    SAXParser parser = factory.newSAXParser();
    SAXJsonParser handler = new SAXJsonParser();
    parser.parse(stream, handler);
    return handler.getJson();
}

И реализация SAXJsonParser:

package xml2json;

import net.sf.json.*;
import org.apache.commons.lang.StringUtils;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;

public class SAXJsonParser extends DefaultHandler {

    static final String TEXTKEY = "_text";

    JSONObject result;
    List<JSONObject> stack;

    public SAXJsonParser(){}
    public JSONObject getJson(){return result;}
    public String attributeName(String name){return "@"+name;}

    public void startDocument () throws SAXException {
        stack = new ArrayList<JSONObject>();
        stack.add(0,new JSONObject());
    }
    public void endDocument () throws SAXException {result = stack.remove(0);}
    public void startElement (String uri, String localName,String qName, Attributes attributes) throws SAXException {
        JSONObject work = new JSONObject();
        for (int ix=0;ix<attributes.getLength();ix++)
            work.put( attributeName( attributes.getLocalName(ix) ), attributes.getValue(ix) );
        stack.add(0,work);
    }
    public void endElement (String uri, String localName, String qName) throws SAXException {
        JSONObject pop = stack.remove(0);       // examine stack
        Object stashable = pop;
        if (pop.containsKey(TEXTKEY)) {
            String value = pop.getString(TEXTKEY).trim();
            if (pop.keySet().size()==1) stashable = value; // single value
            else if (StringUtils.isBlank(value)) pop.remove(TEXTKEY);
        }
        JSONObject parent = stack.get(0);
        if (!parent.containsKey(localName)) {   // add new object
            parent.put( localName, stashable );
        }
        else {                                  // aggregate into arrays
            Object work = parent.get(localName);
            if (work instanceof JSONArray) {
                ((JSONArray)work).add(stashable);
            }
            else {
                parent.put(localName,new JSONArray());
                parent.getJSONArray(localName).add(work);
                parent.getJSONArray(localName).add(stashable);
            }
        }
    }
    public void characters (char ch[], int start, int length) throws SAXException {
        JSONObject work = stack.get(0);            // aggregate characters
        String value = (work.containsKey(TEXTKEY) ? work.getString(TEXTKEY) : "" );
        work.put(TEXTKEY, value+new String(ch,start,length) );
    }
    public void warning (SAXParseException e) throws SAXException {
        System.out.println("warning  e=" + e.getMessage());
    }
    public void error (SAXParseException e) throws SAXException {
        System.err.println("error  e=" + e.getMessage());
    }
    public void fatalError (SAXParseException e) throws SAXException {
        System.err.println("fatalError  e=" + e.getMessage());
        throw e;
    }
}
6 голосов
/ 03 мая 2011

Класс XML в пространстве имен org.json предоставляет вам эту функциональность.

Вам необходимо вызвать статический toJSONObject метод

Преобразует правильно сформированную (но не обязательно действительную) XML-строку в JSONObject.Некоторая информация может быть потеряна при этом преобразовании, поскольку JSON - это формат данных, а XML - это формат документа.XML использует элементы, атрибуты и текст контента, в то время как JSON использует неупорядоченные коллекции пар имя / значение и массивы значений.JSON не любит различать элементы и атрибуты.Последовательности подобных элементов представлены в виде JSONArrays.Текст контента может быть помещен в элемент контента.Комментарии, прологи, DTD и <[[]]> ​​игнорируются.

4 голосов
/ 25 февраля 2011

Преобразование полных файлов docx в JSON не выглядит хорошей идеей, потому что docx - это ориентированный на документы формат XML, а JSON - ориентированный на данные формат. XML в целом предназначен как для документов, так и для данных. Хотя технически возможно преобразовать ориентированный на документы XML в JSON, обработка сгенерированных данных может быть слишком сложной. Попытайтесь сосредоточиться на фактических необходимых данных и преобразовать только эту часть.

4 голосов
/ 25 февраля 2011

Если вам нужно иметь возможность манипулировать вашим XML до того, как он будет конвертирован в JSON, или хотите детально контролировать свое представление, используйте XStream. Это действительно легко конвертировать между: xml-to-object, json-to-object, object-to-xml и object-to-json. Вот пример из документов XStream :

XML:

<person>
  <firstname>Joe</firstname>
  <lastname>Walnes</lastname>
  <phone>
    <code>123</code>
    <number>1234-456</number>
  </phone>
  <fax>
    <code>123</code>
    <number>9999-999</number>
  </fax>
</person>

POJO (DTO):

public class Person {
    private String firstname;
    private String lastname;
    private PhoneNumber phone;
    private PhoneNumber fax;
    // ... constructors and methods
}

Конвертировать из XML в POJO:

String xml = "<person>...</person>";
XStream xstream = new XStream();
Person person = (Person)xstream.fromXML(xml);

А затем из POJO в JSON:

XStream xstream = new XStream(new JettisonMappedXmlDriver());
String json = xstream.toXML(person);

Примечание: хотя метод читает toXML() XStream будет выдавать JSON, поскольку используется драйвер Jettison.

1 голос
/ 10 марта 2016

Если у вас есть действительный файл dtd для фрагмента xml, то вы можете легко конвертировать xml в json и json в xml, используя jar ссылки затмения с открытым кодом. Подробный пример проекта JAVA можно найти здесь: http://www.cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html

0 голосов
/ 25 сентября 2015

Docx4j

Я уже использовал docx4j , и на это стоит взглянуть.

unXml

Вы также можете проверить мою библиотеку с открытым исходным кодом unXml , которая доступна на Maven Central .

Она легкая и имеет простойсинтаксис, чтобы выбрать XPath из вашего xml и вернуть их как атрибуты Json в Jackson ObjectNode.

0 голосов
/ 23 октября 2013

Я наткнулся на учебник, надеюсь, он вам поможет. http://www.techrecite.com/xml-to-json-data-parser-converter

...