【问题标题】:How can I serialize a list of objects using flex json?如何使用 flex json 序列化对象列表?
【发布时间】:2011-08-19 13:34:46
【问题描述】:

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

 List<ProductInfo> 

我想使用 flex json 对其进行序列化,以便它应该喜欢

 [{"product_id":"2","name":'stack"'},{"product_id":"2","name":"overflow"}]"

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

 final List<ProductInformation> productInformationList = new JSONDeserializer<List<ProductInformation>>().use(null, ArrayList.class)
            .use("values", ProductInformation.class).deserialize(parameterValue);

为了将对象序列化为字符串,我正在这样做,但它不起作用....我遗漏了一些东西...

final String serializizedString = new JSONSerializer().serialize(productInformationList);

我需要什么将对象序列化为字符串?

【问题讨论】:

  • 你试过什么?请发布一些代码,展示您为实现目标所做的最佳尝试,并就导致错误或给您带来麻烦的部分提出具体问题...
  • @maerics : 你对 flexjson 有什么想法吗..

标签: java serialization


【解决方案1】:
List<ProductInfo> ls = new JSONDeserializer<ArrayList<ProductInfo>>().use("values", ProductInfo.class).deserialize(s);

关注此link 或仔细阅读以下内容

重构了地图和集合的路径列表。在以前的版本中,无法同时指定 Collection/Map 的具体顶部和其中包含的具体类。路径语言不够冗长。现在您可以指定具体集合和其中包含的具体类。如果 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 )

通过将“keys”和“values”添加到路径 person.friends,您可以指定用于 Map 的键和值的实际具体类。对于集合,您可以简单地附加“值”来指定包含类。例如:

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

【讨论】:

    【解决方案2】:

    我之前从来没有玩过flexjson,但是在下载它并在这里玩之后是我想出的:

    public class TestFlexJson {
      public static void main(String args[]) {
        ProductInfo p1 = new ProductInfo(1, "Stack");
        ProductInfo p2 = new ProductInfo(2, "Overflow");
        List<ProductInfo> infos = Arrays.asList(p1, p2);
        String s = new JSONSerializer()
            .exclude("*.class", "description")
            //.include("productId", "name")
            // EDIT: the "include" call is irrelevant for this example.
            .serialize(infos);
        System.out.println(s);
        // => [{"name":"Stack","productId":1},{"name":"Overflow","productId":2}]
        List<ProductInfo> ls = new JSONDeserializer<List<ProductInfo>>().deserialize(s);
        System.out.println(ls);
        // => [{name=Stack, productId=1}, {name=Overflow, productId=2}]
      }
      public static class ProductInfo {
        private int id;
        private String name;
        private String desc; // Not used, to demonstrate "exclude".
        public ProductInfo(int id, String name) {
          this.id = id;
          this.name = name;
        }
        public int getProductId() { return this.id; }
        public String getName() { return this.name; }
        public String getDescription() { return this.desc; }
      }
    }
    

    似乎对我有用。

    【讨论】:

    • 尝试在产品名称中添加一些字符串,例如“这是(腐烂的)/牛奶,我昨天刚喝了”
    • 是的,使用 JDK 1.6.0_26 和 flexjson-2.1 对我来说仍然可以正常工作。
    • 即使我使用 .include("productID", "productName") 为什么他要回馈字符串-> [{"name":"这是(腐烂)/牛奶,我只是昨天喝了","productId":"1"},{"name":"Overflow","productId":"2"}]
    • 对不起,我不明白你在问什么。 include 方法显然只与作为集合的对象属性相关,默认情况下包含所有非集合属性(请参阅我编辑的答案)。
    • 实际上我试图问为什么在序列化方法中他给出了像“name”和“productId”这样的字符串然后我现在发现它是决定字符串名称的 ProductInformation 的 get 方法名称。非常感谢您的帮助和支持。我没试过,但周一早上试试。 :)
    【解决方案3】:

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

    List<ProductInfo> ls = new JSONDeserializer<List<ProductInfo>>().deserialize(s);     
    System.out.println(ls);     
    // => [{name=Stack, productId=1}, {name=Overflow, productId=2}] 
    

    如果您要尝试直接访问某个元素,比如说ls.get(0)y,您将收到ClassCastException: java.util.HashMap cannot be cast to ProductInfo

    您必须序列化您的对象以包含类属性,以便适当地反序列化为集合。

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多