Подтвердить что ты не робот

Преобразование XML в формат JSON

Мне нужно преобразовать формат файла docx (который находится в формате openXML) в формат JSON. Мне нужны некоторые рекомендации для этого. Спасибо заранее.

4b9b3361

Ответ 1

Вы можете ознакомиться с библиотекой Java Json-lib, которая обеспечивает преобразование XML-to-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>");  

Ответ 2

Не существует прямого сопоставления между 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.

Edit:

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

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

Ответ 3

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

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

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

Ответ 4

Если вы недовольны различными реализациями, попробуйте перевести их самостоятельно. Вот какой код я написал сегодня днем, чтобы вы начали. Он работает с 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;
    }
}

Ответ 5

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

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.

Ответ 6

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

Ответ 7

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

Ответ 9

docx4j

Раньше я использовал docx4j, и стоит взглянуть на него.

unXml

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

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

Ответ 10

Используйте xmlSerializer.setForceTopLevelObject(true), чтобы включить корневой элемент в полученный JSON.

Ваш код будет таким

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