我需要将Java Object转换为JSON String。 以下是我使用的代码:
public class XstreamTest {
public static void main(String[] args) throws Exception {
Order order = new Order();
order.id = 1;
order.products = new ArrayList<Product>();
Product prod1 = new Product();
prod1.barCode = "4821111111111";
Product prod2 = new Product();
prod2.barCode = "4821111111112";
order.products.add(prod1);
order.products.add(prod2);
System.out.println(toJson(order));
}
public static String toJson(Object document) throws Exception {
XStream xstream = new XStream(new JettisonMappedXmlDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
}
});
xstream.autodetectAnnotations(true);
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias(document.getClass().getSimpleName(),
document.getClass());
return xstream.toXML(document);
}
}
@XStreamAlias("ORDER")
class Order {
@XStreamAlias("NUMBER")
public int id;
@XStreamAlias("PRODUCT")
@XStreamImplicit(itemFieldName="PRODUCT")
public List<Product> products;
}
class Product {
@XStreamAlias("BARCODE")
public String barCode;
}
跑完后,我有结果:
{
"NUMBER": 1,
"PRODUCT": {
"BARCODE": "4821111111111"
},
"PRODUCT": {
"BARCODE": "4821111111112"
}
}
我在http://www.jslint.com/检查json并收到错误:重复&#39; PRODUCT&#39;。
请帮忙!我做错了什么?或者可能是XStream中的错误?
答案 0 :(得分:3)
只需从@XStreamImplicit(itemFieldName="PRODUCT")
课程中的products
字段中删除注释Order
即可。这指示XStream将您的集合序列化为隐式集合,这意味着集合将没有根对象,并且其所有元素将被单独序列化并封装在名为其名称的对象中集合(PRODUCT
)。这会导致JSON对象具有多个具有相同名称(PRODUCT
)的属性,这些属性无效。
顺便说一下,XStream最初是为了序列化XML,你可能会尝试使用专用的JSON序列化程序库,例如GSON。
<强>更新强>
当您使用相同的POJO反序列化XML时,删除提到的注释会破坏XML反序列化,您必须“手动”配置XStream,以便它可以在反序列化XML期间处理隐式集合:
xstream.addImplicitCollection(Order.class, "products", "PRODUCT", Product.class);
这与注释具有相同的效果,只是它仅适用于反序列化。