Java 如何使用flex json序列化对象列表?

Java 如何使用flex json序列化对象列表?,java,serialization,Java,Serialization,我有一个对象列表,如下所示 List<ProductInfo> 为了将上述字符串反序列化为对象列表,我使用以下代码 final List<ProductInformation> productInformationList = new JSONDeserializer<List<ProductInformation>>().use(null, ArrayList.class) .use("values", Produ

我有一个对象列表,如下所示

 List<ProductInfo> 
为了将上述字符串反序列化为对象列表,我使用以下代码

 final List<ProductInformation> productInformationList = new JSONDeserializer<List<ProductInformation>>().use(null, ArrayList.class)
            .use("values", ProductInformation.class).deserialize(parameterValue);
将对象序列化为字符串需要什么?

我以前从未玩过,但下载并玩过之后,我想到了以下几点:

公共类TestFlexJson{
公共静态void main(字符串参数[]){
ProductInfo p1=新ProductInfo(1,“堆栈”);
ProductInfo p2=新ProductInfo(2,“溢出”);
List infos=Arrays.asList(p1,p2);
字符串s=新的JSONSerializer()
.exclude(“*.class”,“description”)
//.包括(“产品ID”、“名称”)
//编辑:“include”调用与本例无关。
.序列化(infos);
系统输出打印项次;
//=>[{“名称”:“堆栈”,“产品ID”:1},{“名称”:“溢出”,“产品ID”:2}]
List ls=新的JSONDeserializer()。反序列化;
系统输出打印项次(ls);
//=>[{name=Stack,productId=1},{name=Overflow,productId=2}]
}
公共静态类ProductInfo{
私有int-id;
私有字符串名称;
私有字符串desc;//未使用,用于演示“排除”。
公共产品信息(int-id,字符串名称){
this.id=id;
this.name=名称;
}
public int getProductId(){返回this.id;}
公共字符串getName(){返回this.name;}
公共字符串getDescription(){返回this.desc;}
}
}

似乎对我很有用。

不幸的是,如果需要将json反序列化到集合中,则必须包含class属性。在上面的示例中,json字符串反序列化如下:

List<ProductInfo> ls = new JSONDeserializer<List<ProductInfo>>().deserialize(s);     
System.out.println(ls);     
// => [{name=Stack, productId=1}, {name=Overflow, productId=2}] 
List ls=new JSONDeserializer()。反序列化;
系统输出打印项次(ls);
//=>[{name=Stack,productId=1},{name=Overflow,productId=2}]
如果您试图直接访问一个元素,假设
ls.get(0)
y您将收到一个
ClassCastException:java.util.HashMap不能转换为ProductInfo

您必须序列化对象以包含class属性,以便将其适当地反序列化到集合中。

List ls=new JSONDeserializer或仔细阅读以下内容

List<ProductInfo> ls = new JSONDeserializer<ArrayList<ProductInfo>>().use("values", ProductInfo.class).deserialize(s);
映射和集合的重构路径列表。在以前的版本中,无法同时指定集合/映射的具体顶部和其中包含的具体类。路径语言不够详细。现在,您可以指定其中包含的具体集合和具体类。如果person.friends是指向java.util.Map的路径。比如说,

new JSONDeserializer<Person>()
    .use( "person.friends", HashMap.class )
    .use("person.friends.keys", Relation.class )
    .use( "person.friends.values", Person.class )
新的JSONDeserializer()
.use(“person.friends”,HashMap.class)
.use(“person.friends.keys”,Relation.class)
.use(“person.friends.values”,person.class)
通过将“键”和“值”添加到路径person.friends,您可以指定用于映射的键和值的实际具体类。对于集合,您可以简单地附加“值”以指定包含的类。例如:

new JSONDeserializer<List<Person>>().use( "people", ArrayList.class ).use("people.values", Person.class )
new JSONDeserializer().use(“people”,ArrayList.class)。use(“people.values”,Person.class)

您尝试过什么?请发布一些代码,展示您在实现目标方面的最佳尝试,并就导致错误或给您带来麻烦的部分提出具体问题…@maerics:您对flexjson有什么想法吗..尝试在产品名称中使用一些字符串,如“这是(腐烂)/牛奶,我昨天刚喝过”是的,使用JDK 1.6.026和flexjson-2.1对我来说仍然很好。即使我使用了。include(“productID”,“productName”)为什么他要返回字符串->[{“name”:“这是(腐烂)/牛奶,我昨天刚喝过”,“productID:“1”},{“name”:“溢出”,“productID:“2”}]对不起,我不明白你在问什么。
include
方法显然只与作为集合的对象属性相关,默认情况下,所有非集合属性都包括在内(请参见我编辑的答案)。实际上,我想问,为什么在序列化方法中,他会给出“name”和“productId”这样的字符串然后我发现现在是ProductInformation的get方法名决定了字符串名。非常感谢你的帮助和支持。我没试过,但周一早上试一下。:)
new JSONDeserializer<Person>()
    .use( "person.friends", HashMap.class )
    .use("person.friends.keys", Relation.class )
    .use( "person.friends.values", Person.class )
new JSONDeserializer<List<Person>>().use( "people", ArrayList.class ).use("people.values", Person.class )