我已经尝试解决这个问题很长一段时间了,但我似乎没有更多的路线可走。
我有一些反斜杠,我设法用替换(“\”,“”)删除了它,但我仍然有一些像这样的引号 --->“就在我的 map 的开头,但我没有知道它是如何到达那里的。
这是我的代码:
public void actionPerformed(ActionEvent e) {
JsonObject obj = new JsonObject();
JsonArray ingredList = new JsonArray();
Map<String, String> ingredientAsMap = new HashMap<>();
JsonArray prepTime = new JsonArray();
Map<String, String> prepTimeAsMap = new HashMap<>();
JsonArray cookTime = new JsonArray();
Map<String, String> cookTimeAsMap = new HashMap<>();
obj.addProperty("Recipe Name", textField1.getText().toString());
for (int r = 0; r < model.getRowCount(); r++) {
ingredientAsMap.put("Ingredient", model.getValueAt(r, 0).toString());
ingredientAsMap.put("Measure", model.getValueAt(r, 1).toString());
ingredientAsMap.put("Quantity", model.getValueAt(r, 2).toString());
ingredList.add(String.valueOf(ingredientAsMap));
}
obj.addProperty("Ingredients Lists", String.valueOf(ingredList));
obj.addProperty("Preparation", editorPane1.getText().toString());
prepTimeAsMap.put("Hours", spinner3.getValue().toString());
prepTimeAsMap.put("Mins", spinner2.getValue().toString());
prepTime.add(String.valueOf(prepTimeAsMap));
obj.addProperty("Preparation Time", String.valueOf(prepTime));
cookTimeAsMap.put("Hours", spinner1.getValue().toString());
cookTimeAsMap.put("Mins", spinner4.getValue().toString());
cookTime.add(String.valueOf(cookTimeAsMap));
obj.addProperty("Cooking Time", String.valueOf(cookTime));
Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
String json = gson.toJson(obj).replace("\\", "");
try{
FileWriter writer = new FileWriter(System.getProperty("user.dir") + "\\" + textField1.getText().toString() + ".json");
BufferedWriter bw = new BufferedWriter(writer);
bw.write(json);
bw.close();
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println(json);
//System.out.println(System.getProperty("user.dir") + "\\" + textField1.getText().toString() + ".json");
}
这是填写表单后得到的输出:
{
"Recipe Name": "Test",
"Ingredients Lists": "["{Ingredient=Ingredient0, Measure=ml, Quantity=0}","{Ingredient=Ingredient1, Measure=ml, Quantity=0}"]",
"Preparation": "This is a test.",
"Preparation Time": "["{Hours=0, Mins=0}"]",
"Cooking Time": "["{Hours=0, Mins=0}"]"
}
注意配料表、准备时间和 cooking 时间中[之前的“。我如何去掉它们?
提前致谢!
最佳答案
您的问题始于这样的行
obj.addProperty("Ingredients Lists", String.valueOf(ingredList));
obj.addProperty("Preparation Time", String.valueOf(prepTime));
对于 HashMap,请参阅 How to convert hashmap to JSON object in Java (不是已接受的答案,而是 Gson 答案)
同样,对于 JSONArray,您不需要 String.value
它们。直接添加就可以了。从 API 中,使用 add(String name, JsonElement element)
方法。
obj.add("Preparation Time", prepTime);
<小时/>
详细解答
停止字符串替换。您的内部数据集不是 JSON,因此您错误地构建了该 JSON。
注意语法突出显示
无效
{ "Preparation Time": "["{Hours=0, Mins=0}"]" }
有效 - 内部字符串已转义。
{ "Preparation Time": "[\"{Hours=0, Mins=0}\"]" }
对于任何 JSON 解析器来说本质上都是如此
{ "Preparation Time": "..." }
<小时/>
您可以getString("Preparation Time")
,它会以字符串形式返回"[\"{Hours=0, Mins=0}\"]"
。如果将其转换为 JSONArray
,那么它就是一个字符串数组。打印第一个元素,您应该只看到 "{Hours=0, Mins=0}"
(保留引号),因此您应该替换引号和 {}
字符,而不是反斜杠。你可以分割等号来获取键值等等......但这听起来像是很多工作。
基本上,键值 JSON 对中没有等号。
{Ingredient=Ingredient0, Measure=ml, Quantity=0}
因此,Gson 正在将这些键的每一个值视为 String
类型,并且当您打印数据时,任何引号或反斜杠都将被转义,但它存储在内存中转义。
但是,您想要解析的额外数据与 JSON 解析无关,所以这就是我的提示,希望您可以停止摸索。
<小时/>无论如何,这里是该数据的 JSON。因此,我的建议是修复模型类和生成此数据的代码段。
{
"Recipe Name": "Test",
"Ingredients Lists": [{
"Ingredient": "Ingredient0",
"Measure": "ml",
"Quantity": 0
}, {
"Ingredient": "Ingredient1",
"Measure": "ml",
"Quantity": 0
}],
"Preparation": "This is a test.",
"Preparation Time": [{
"Hours": 0,
"Mins": 0
}],
"Cooking Time": [{
"Hours": 0,
"Mins": 0
}]
}
关于java - json 无效,引号和反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41843071/