json无效,引用和反斜杠

时间:2017-01-25 03:48:04

标签: java json

我一直试图解决这个问题很长一段时间但我似乎没有更多的路要走了。

我有一些反斜杠,我设法删除替换(" \","")但我仍然有一些像这样的引号---> "就在我的地图的开头,我不知道它是如何到达那里的。

这是我的代码:

        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}"]"
    }

注意&#34;在[成分列表,准备时间和烹饪时间之前]。我如何摆脱它们?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您的问题从这些行开始

obj.addProperty("Ingredients Lists", String.valueOf(ingredList));
obj.addProperty("Preparation Time", String.valueOf(prepTime));

对于HashMaps,请参阅 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
    }]
}