【发布时间】: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