我正在构建一个宁静的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库,因为它似乎是最简单的方法。
答案 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();
}