Java JSON-将JSON字符串放入JSON对象时出错
我使用Jersey的Java web服务创建和编辑市场价格。为此,我发送了一个包含市场信息的JSON对象,包括另一个用于价格的JSON对象 例如,这是我通过邮递员发布的JSON:Java JSON-将JSON字符串放入JSON对象时出错,java,json,jersey,gson,Java,Json,Jersey,Gson,我使用Jersey的Java web服务创建和编辑市场价格。为此,我发送了一个包含市场信息的JSON对象,包括另一个用于价格的JSON对象 例如,这是我通过邮递员发布的JSON: { "name": "Market 01", "address": "Market 01 street", "prices": "{\"watermelon\": \"5.40\", \"melon\": \"2.55\"}" } 在web服务器端,我尝试使用GSON创建一个价格列表,但无法使
{
"name": "Market 01",
"address": "Market 01 street",
"prices": "{\"watermelon\": \"5.40\", \"melon\": \"2.55\"}"
}
在web服务器端,我尝试使用GSON创建一个价格列表,但无法使其正常工作。我的目标是检查新价格和当前价格之间的差异。下面是我的POJO Price.java,我试图在控制器上进行编辑,以及在Postman上得到的异常:
POJO-Price.java
public class Price {
private String nome;
private Double preco;
//Getters and setters also
}
public class Price {
private String name;
private Double price;
...
@Override
public String toString() {
return "{\"name\":\"" + name + "\", \"price\":" + price + "}";
}
}
MarketController.java
Collection<Price> prices = gson.fromJson(json, new TypeToken<List<Price>>(){}.getType());
// When going from List<Price> to JSON String
String prices = gson.toJson(market.getPrices());
// When going from JSON String to List<Price>
List<Price> prices = gson.fromJson(jsonString, new TypeToken<List<Price>>(){}.getType());
编辑:基于@A2H响应为我提供的解决方案:
POJO类-Price.java
public class Price {
private String nome;
private Double preco;
//Getters and setters also
}
public class Price {
private String name;
private Double price;
...
@Override
public String toString() {
return "{\"name\":\"" + name + "\", \"price\":" + price + "}";
}
}
POJO类-Market.java
public class Market{
...
//Include as a List<Price>
private List<Price> prices;
...
}
公共类市场{
...
//列入清单
私人标价;
...
}
MarketController.java
Collection<Price> prices = gson.fromJson(json, new TypeToken<List<Price>>(){}.getType());
// When going from List<Price> to JSON String
String prices = gson.toJson(market.getPrices());
// When going from JSON String to List<Price>
List<Price> prices = gson.fromJson(jsonString, new TypeToken<List<Price>>(){}.getType());
//从列表转到JSON字符串时
字符串prices=gson.toJson(market.getPrices());
//从JSON字符串转到列表时
ListPrices=gson.fromJson(jsonString,newTypeToken(){}.getType());
对于这种情况,此代码非常全面,您需要从列表转换为JSON字符串,反之亦然。这是因为
列表将由JSON数组表示,而不是由您提供的对象表示。您可以尝试反序列化到映射(或发送数组)。您的POJO意味着您应该在JSON
对象中有一个价格数组
下面是一个完整的工作示例
package test;
import java.util.List;
import com.google.gson.Gson;
public class TESTTEST {
public class MarketInfo {
String name;
String address;
List<Price> prices;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Price> getPrices() {
return prices;
}
public void setPrices(List<Price> prices) {
this.prices = prices;
}
}
public class Price {
String nome;
Double preco;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Double getPreco() {
return preco;
}
public void setPreco(Double preco) {
this.preco = preco;
}
@Override
public String toString() {
return "{\"nome\":\"" + nome + "\", \"preco\":" + preco + "}";
}
}
public static void main(String[] args) {
Gson gson = new Gson();
String jsonString = "{\"name\": \"Market 01\",\"address\": \"Market 01 street\","
+ "\"prices\": [{\"nome\":\"watermelon\",\"preco\":\"5.40\"}, {\"nome\":\"melon\",\"preco\": \"2.55\"}]}";
MarketInfo res = gson.fromJson(jsonString, MarketInfo.class);
System.out.println(res.getPrices());
}
}
封装测试;
导入java.util.List;
导入com.google.gson.gson;
公共类测试{
公共类市场信息{
字符串名;
字符串地址;
标价;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getAddress(){
回信地址;
}
公共无效设置地址(字符串地址){
this.address=地址;
}
公开价目表{
退货价格;
}
公共价格(标价){
价格=价格;
}
}
公共类价格{
字符串名称;
双预编码;
公共字符串getNome(){
返回nome;
}
公共无效集合名称(字符串名称){
this.nome=nome;
}
公共双getPreco(){
返回预编码;
}
公共无效setPreco(双预co){
this.preco=preco;
}
@凌驾
公共字符串toString(){
返回“{\“nome\”:\”+nome+“\”,\“preco\”:“+preco+”}”;
}
}
公共静态void main(字符串[]args){
Gson Gson=新的Gson();
String jsonString=“{\“name\”:\“Market 01\”,\“address\”:\“Market 01 street\”,“
+“‘价格’:[{\'nome\':\'西瓜\',\'preco\':\'5.40\',{\'nome\':\'瓜\',\'preco\':\'2.55\'”}”;
MarketInfo res=gson.fromJson(jsonString,MarketInfo.class);
System.out.println(res.getPrices());
}
}
你能举个例子吗?您所说的是这样的:Collection prices==gson.fromJson(json,new-TypeToken(){}.getType())代码>?是的,有点。这将给您另一个错误,因为结果与集合
不兼容。您可以更改输入字符串吗?例如:{“nome”:“甜瓜”、“preco”:5.40}
如果是,那么您可以拥有一个这样的对象数组,可以轻松地将其转换为列表
@A2H。当我将输入更改为您的示例时,相同的错误仍然存在。如何使其与Hibernate一起工作?我的意思是,我的目标是将价格存储为数据库中的JSON字符串。这是一个不同的问题,但我假设您有一个命名查询,您可以将JSON字符串传递给该查询,并将其保存在您选择的表字段中。然后,每当你读到这个JSON字符串时,你就可以像上面描述的那样构造对象。问题是当我试图重新创建列表以与新列表进行比较时。有没有可能在不重新创建列表的情况下进行比较,或者我真的需要做这一步?妈的。我成功了!非常感谢,伙计!将编辑问题,以包括答案以及!好的,我很高兴它对你有用。如果要比较对象,最好构造两个Price
对象,看看它们是否相等,而不是比较JSON
字符串。重写Price
类的equals
和hashCode
方法,以包含比较类Price
的两个实例的逻辑。