gpt4 book ai didi

java - 将 Json 文件反序列化为包含以对象为键的映射的 java 对象

转载 作者:行者123 更新时间:2023-12-01 21:34:43 24 4
gpt4 key购买 nike

我正在努力寻找一种方法来读取需要适合 map 的 json 文件。所以,我有一个只包含字符串变量成分的类成分。在另一个名为 Recipe 的类中,我有一个 Map 来跟踪该特定食谱所需的成分和数量,以及一个用于表示 Recipe 名称的字符串。

public class Recipe implements Serializable{

private String name;
private Map<Ingredients,Integer> ingredientsList = new HashMap<>();

public Recipe() {
}

public String getName() {
return name;
}

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

public Map<Ingredients, Integer> getIngredientsList() {
return ingredientsList;
}

public void setIngredientsList(Map<Ingredients, Integer> ingredientsList) {
this.ingredientsList = ingredientsList;
}

@Override
public String toString() {
return "Recipe{" +
"name='" + name + '\'' +
", ingredientsList=" + ingredientsList +
'}';
}
}

我有一个 testClass,其中包含两种方法,一种将我的食谱写入 json 文件,另一种从同一个 json 文件读取它

@Test
public void writeToJsonFile(){
Ingredients pasta = new Ingredients();
pasta.setName("pasta");
Ingredients bolognaise = new Ingredients();
bolognaise.setName("bolognaise");

Map<Ingredients,Integer>ingredientsIntegerMap = new HashMap<>();
ingredientsIntegerMap.put(pasta,500);
ingredientsIntegerMap.put(bolognaise,600);

Recipe spaghetti = new Recipe();
spaghetti.setName("spaghetti");
spaghetti.setIngredientsList(ingredientsIntegerMap);

Gson gson = new Gson();
try {
FileWriter writer = new FileWriter("src/test/resources/recipe1.json");
writer.write(gson.toJson(spaghetti));
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}

@Test
public void readFromJsonFile(){
Gson gson = new Gson();
try {
BufferedReader buffer = new BufferedReader(new FileReader("src/test/resources/recipe1.json"));
Recipe dish =gson.fromJson(buffer, Recipe.class);
System.out.println(dish);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

现在我的问题如下,当我创建一个包含某些成分的配方并将其保存到 json 填充时,我没有任何问题,一切正常,但当我想将创建的 Jason 文件加载到配方时,它却没有不工作。

这是我尝试读取 Json 文件时收到的错误消息

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 4 column 6 path $.ingredientsList.

这里是创建的包含配方的 Json 文件

{
"name":"spaghetti",
"ingredientsList":{
"Ingredients{name\u003d\u0027pasta\u0027}":500,
"Ingredients{name\u003d\u0027bolognaise\u0027}":600
}
}

当我删除食谱类中的 map 或将其替换为列表时,一切正常,但我想使用 map ,导致出现此问题。

有人可以帮助解决这个问题或推荐另一种方法来跟踪食谱的成分量

谢谢

最佳答案

将不包含任何唯一标识符的对象作为键放入映射中有点奇怪。也许将 Ingredients 类更改为枚举会更好,如下所示:

public enum Ingredients {
PASTA,
BOLOGNAISE
}

您的 JSON 将更改为:

{
"name":"spaghetti",
"ingredientsList":{
"PASTA":500,
"BOLOGNAISE":600
}
}

或者创建一个聚合对象,例如:

public class IngredientQuantity {

private Ingredient ingredient;
private double quantity;

}

class Ingredient {
private String name;
}

然后用一个简单的列表替换您的 map :

{
"name": "spaghetti",
"ingredientsList": [
{
"ingredient": {
"name": "PASTA"
},
"quantity": 500
},
{
"ingredient": {
"name": "BOLOGNAISE"
},
"quantity": 600
}
]
}

关于java - 将 Json 文件反序列化为包含以对象为键的映射的 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58806130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com