java - json 无效,引号和反斜杠

标签 java json

我已经尝试解决这个问题很长一段时间了,但我似乎没有更多的路线可走。

我有一些反斜杠,我设法用替换(“\”,“”)删除了它,但我仍然有一些像这样的引号 --->“就在我的 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/

相关文章:

java - 从类似于 SQL LIKE '%search%' 的数组中过滤值

java - @RequestMapping 无法解析为类型 - 仅适用于 @Controller,不适用于 @RestController

java - I-net Clear 报告的 17 Engine 类 setData 未保持数据参数的排序顺序

java - 对我的 logout.jsp 代码的其他修复

java - 通过 ajax 调用调用操作方法时出现意外行为

php - Json 编码对某些列不返回任何内容

javascript - 如何使用 Typeahead.js 0.10 一步一步/远程/预取/本地

arrays - 从 json 而不是 Angular 5 数组中获取数据

java - 我 mock 的对象是我想象的那样吗?想要但未调用错误

java - JDT 编译器中的 com.sun.tools.javac.jvm.ClassWriter 等效项