Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON-将JSON字符串放入JSON对象时出错_Java_Json_Jersey_Gson - Fatal编程技术网

Java 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创建一个价格列表,但无法使

我使用Jersey的Java web服务创建和编辑市场价格。为此,我发送了一个包含市场信息的JSON对象,包括另一个用于价格的JSON对象

例如,这是我通过邮递员发布的JSON:

{
    "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
的两个实例的逻辑。