【问题标题】:Dynamic Conversion of XML to JSONXML 到 JSON 的动态转换
【发布时间】:2012-01-12 03:38:50
【问题描述】:

是否有任何方法(如果可能,使用 Java 代码示例)在不了解 XML 源(文件、字符串等)?

例如,假设一个具有未知结构和多个嵌套级别的非常大的 XML 数据集存储在一个大文本文件中。将所有内容读入内存是不可能的(因为空间不足),他们想直接将其转换为JSON,即,无需编写任何代码来检测和处理StAX标签(例如,START_ELEMENTCHARACTERS , END_ELEMENT)。

理想的解决方案是从转换器获取ReaderInputStream,例如,提供XML 文件,ReaderInputStream 生成JSON,以供输入到 FileOutputStream,甚至直接到 JSON 解析器,如 Jackson。如果这是不可能的,那么至少一种渐进式读取 XML 文件、转换为 JSON 并写入另一个文件的方法是可以接受的折衷方案。

可用于从/转换为 XML/JSON 的工具(例如,StaxONJSON-libJettisonXStream)似乎不能这样做,而只能转换已知结构。

编辑: 从 OutputStream 或 Writer 获取 ReaderInputStream(这也包括我上面提到的“转换”),可以通过多种方式完成,尽管为了获得最佳结果和“无限”输入大小,涉及到多线程。在article in Ostermiller.org 中描述了解决方案,在IO-Tools library 中可以找到类似的实现。

【问题讨论】:

    标签: java xml json


    【解决方案1】:

    这是一个简单的例子,它使用 Java 的内置 StAX 实现到 parse XML 和 Jettison 到 produce JSONXMLEventWriter 有一个方便的 add(XMLEventWriter) 方法,可以将读者与作者联系起来,让这变得超级简单:

    import org.codehaus.jettison.mapped.MappedXMLOutputFactory;
    
    import javax.xml.stream.XMLEventReader;
    import javax.xml.stream.XMLEventWriter;
    import javax.xml.stream.XMLInputFactory;
    import java.io.StringReader;
    import java.util.HashMap;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            String xml =
                "<root><foo>foo string</foo><bar><x>1</x><y>5</y></bar></root>";
            XMLEventReader reader = XMLInputFactory.newInstance()
                .createXMLEventReader(new StringReader(xml));
            XMLEventWriter writer = new MappedXMLOutputFactory(new HashMap())
                .createXMLEventWriter(System.out);
            writer.add(reader);
            writer.close();
            reader.close();
        }
    }
    

    我创建了一个独立的 Maven 项目来演示这个 on Github

    【讨论】:

    • 这提供了“写入文件”(或标准输出)的解决方案。感谢您的回答和额外的努力!
    • 你如何忽略评论标签?当xml中有注释标签时,XMLEventWriter会抛出异常。
    • @ShaggyInjun:这应该是它自己的问题,并附有示例代码,而不是对 1.5 年前的答案的评论。
    • 感谢您的回复,我在发布此消息之前创建了一个问题,因为我想您会这么说。任何帮助表示赞赏。 stackoverflow.com/questions/16428574/…
    • 首先在 xmlns="..." 上获得 IllegalStateException。二、去掉xmlns后,得到java.lang.ClassCastException: java.lang.String cannot be cast to org.codehaus.jettison.json.JSONObject
    【解决方案2】:

    您可以使用 StAXON 执行此操作,请参阅 https://github.com/beckchr/staxon/wiki/Converting-XML-to-JSON 以获取示例代码。

    【讨论】:

    • 显然您可以写入文件,但没有直接的方法将 JSON 输出“管道”到阅读器或 InputStream。谢谢。
    【解决方案3】:

    underscore-java 库包含静态方法 fromXml 和 toJson。我是项目的维护者。

    代码示例:

    import com.github.underscore.lodash.U;
    import java.util.Map;
    import org.junit.Test;
    import static org.junit.Assert.assertEquals;
    
    public class StringTest {
    
        @Test
        public void toJsonFromXml() {
            final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n"
                + "  <FirstItem>1</FirstItem>\n  <SecondItem>2</SecondItem>\n</root>";
            assertEquals("{\n"
                + "  \"root\": {\n"
                + "    \"FirstItem\": \"1\",\n"
                + "    \"SecondItem\": \"2\"\n"
                + "  }\n"
                + "}",
                U.toJson((Map<String, Object>) U.fromXml(xml)));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 1970-01-01
      • 2012-08-16
      • 2021-01-30
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多