【问题标题】:Is it bad practice to convert xml or json manually to java objects?手动将 xml 或 json 转换为 java 对象是不好的做法吗?
【发布时间】:2015-08-19 10:52:28
【问题描述】:

对于一个项目,我不得不使用某些网络服务。我创建了一个小型 java 项目,它只打开正确的 httpconnection、写入输入并获取输出。这个输出一般是xml文本或者json文本。我现在想知道如何将此文本转换为 java 对象。

我可以使用以下 OOP 方案手动执行此操作:调用 Web 服务时,如果它有输出,则必须提供“处理程序”类。这个处理程序类必须符合这个接口:

public interface Handler<T>
{
    public T handle(Byte[] webserviceOutput)
}

还有一个针对特定 XML 案例的辅助类:

public abstract class XMLHandler<T> implements handler<T>
{
    public T handle(Byte[] webserviceOutput)
    {
         Document xmldoc = convertByteArrayToDocument();
         return parseXmlDoc(xmlDoc);
    }

    public abstract T parseXmlDoc(Document xmlDoc);
}

我喜欢这个接口的干净程度,但实际的实现非常不干净,而且都涉及到逐行解析整个输入并手动调用大量设置器(换句话说:没有使用反射)。

另一方面,存在将 json 和 xml 转换为现有 java 对象的库。它们的主要缺点是它们非常不灵活,因为字段的名称必须与 xml 中的名称完全匹配。当与疯狂的 dba 打交道时,这是一个负担,他们将所有字段都缩写成乱码(例如字段“apb”,它应该命名为“adjustablePersonBudget”)。另一个问题是自动转换往往很冗长。例如,xml

<books>
    <book></book>
    <book></book>
    ...
</books>

在java中的结果:

rootObject.getBooks().getBookList() 而不仅仅是rootObject.getBookList()

使用库的明显优势是您不需要转换类而只是反射。

您对企业软件的这两种方法有何经验和想法?

【问题讨论】:

  • JAXB 可以让它变得更简单,如果你喜欢那种东西的话。你的方法没有问题。
  • 关于 JSON,如果您使用 Jackson 为例,您可以使用 @JsonProperty 将不同的名称映射到您的字段,例如:@JsonProperty("al_count") private long numberOfAlarms;
  • 不要使用Byte[]:改用byte[]

标签: java json xml web-services


【解决方案1】:

如果您有 XML 模式,那么 JAXB 就很好 - 作为 JDK 的一部分。通过运行例如生成java类xjc -p foo myschema.xsd

读取一个 XML 文件并取回一个对象(从 xjc 工具生成的类):

JAXBContext context = JAXBContext.newInstance(FooObj.class);
Unmarshaller unMarshaller = context.createUnmarshaller();
FooObj param = (FooObj) unMarshaller.unmarshal(new FileInputStream("Foo.xml"));

如果您只想将部分 XML 文档转换为对象,您可以执行类似的操作,例如,您应该能够为 JAXB 提供 DOM 文档的一部分,而不是像上面所做的那样提供整个文件。 你可以在这里查看Converting XML to Java objects

【讨论】:

    【解决方案2】:

    要问自己的一个问题是:您真的需要 Java 吗?所谓的“XRX”理念是通过使用 XQuery、XSLT 和 XForms 等语言和工具将数据端到端地保存在 XML 模型中。正如您所发现的,将数据从一种格式转换为另一种格式最终可能会完成项目的一半工作,如果可以的话,最好避免这样做。

    【讨论】:

      猜你喜欢
      • 2014-06-13
      • 2011-06-15
      • 2018-07-08
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 2017-02-14
      相关资源
      最近更新 更多