0

我需要将 Java 对象转换为 JSON 字符串。这是我使用的代码,例如:

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并得到错误:重复的“产品”。

请帮忙!我做错了什么?或者可能是 XStream 中的错误?

4

1 回答 1

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);

这与注释具有相同的效果,只是它仅适用于反序列化。

于 2013-09-05T18:44:10.747 回答