使用Gson将从json输出中检索的数据保存到数组中

时间:2013-01-12 19:38:48

标签: java

我正在构建一个宁静的Web服务以及一个使用Web服务的Java客户端。发送到客户端的服务器响应采用json格式。我想将json字符串中的属性和数据存储到数组中,因此我可以使用这些数据来构建一些客户端操作。假设我有一系列产品。其余服务器的输出采用这种格式,我只需将它放在一个字符串变量中:

String output="{"product":[{"code":"7","name":"book","value":"4.0"},{"code":"3","name":"pen","value":"4.5"},{"code":"9","name":"pencil","value":"5.5"}]}"

我试图将json对象转换为Product

类型的java对象
Gson gson = new GsonBuilder().serializeNulls().create();
Product product= gson.fromJson(output,Product.class);
System.out.println(product);

输出结果为:

product:[product:null,name:book,code:7,value:4,000000,       
product:null,name:pen,code:3,value:4,500000,  
product:null,name:pencil,code:9,value:5,500000],name:null,code:null,value:null

当我

System.out.println(product.product);

输出是:

[product:null,name:book,code:7,value:4,000000,     
product:null,name:pen,code:3,value:4,500000,   
product:null,name:pencil,code:9,value:5,500000]

第一个问题:我不知道为什么出现空值,我找不到可以解决这个问题的方法。

第二个问题:我一直在寻找几天,但我真的找不到将这些数据保存到数组或列表中的方法。我不想将它们保存在java Products对象中。我想要做的是将所有属性放在一起,例如所有值的数组,或名称或所有产品。

Something like this I have in mind:

String[] names=["book","pen","pencil"];
Integer[] codes=[7,3,9];
Double[] values=[4.0,4.5,5.5];

第三个问题:我应该在服务器端进行这些操作(例如计算总值)吗?这会是更好的方式吗?

第四个问题:是否有必要在客户端复制Products类?这就是我不确定CRUD之外的操作绝对应该在客户端的原因。

产品类别:

class Product  {

public String name;
public Integer code;
public Double value;
public List<Product> product;


public String getName()
{
    return name;
}

public void setName(String name)
{
    this.name=name;
}

public Integer getCode()
{
    return code;
}

public void setCode(Integer code)
{
    this.code=code;
}

public Double getValue()
{
    return value;
}

public void setValue(Double value)
{
    this.value=value;
}
public List<Product> getProduct() 
{ 
    return product; 
}
 public void setProduct(List<Product> order) 
 { 
     this.product = product; 
 }
@Override
public String toString() {
 return    String.format("product:%s,name:%s,code:%d,value:%f",product,name,code,value);
      }
}

我正在使用Gson库,因为它似乎是最简单的方法。

1 个答案:

答案 0 :(得分:1)

首先,“null”值的出现:这可能是由于toString()方法的工作方式。只需检查它的作用。如果将null附加到String,则它将打印为文字“null”。 其次,为什么不想将您的产品作为产品对象存储在客户端上?这就是面向对象编程的全部内容,将各种东西放在一起。只需将它们全部放入集合中,然后定义迭代该集合的方法,以获取所需的所有价格,名称和其他内容,或者对产品执行任何操作。我认为没有充分的理由不在客户端中安装Product类。或者更确切地说,对于包含该类的客户端和服务器使用共享项目,因此您可以在不必担心保持同步的情况下使用它。

您的JSON字符串包含一个列表,但您尝试检索单个对象。试试这个:

final List<Product> products = new Gson().fromJson(jsonString,
new TypeToken<Collection<Product>>() {
            }.getType());

然后你应该能够迭代结果,例如像这样:

double totalValue=0; 
for (Product product:products) {
    totalValue+=product.getValue();
}