【问题标题】:Add quotes to string java将引号添加到字符串 java
【发布时间】:2016-08-21 15:29:55
【问题描述】:

尝试输出一些带有引号 (") 的文本:

public static String expectedFormatData(ItemRequested currentController) {
    String result = "";

    switch (currentController) {
        case ROOM: result = "{\"roomName\" : roomName, \"squareFootage\" : squareFootage"; break;
        case EQUIPMENT: result = "{\"equipmentName\" : roomName}"; break;
        case CONTROL: result = "{\"controlName\" : roomName}"; break;
        case VALUE: result = "{value}"; break;
        default: break;
    }
    return result;
}

输出:

  "message": "Can't make that request. Expected data format: {\"roomName\" : roomName, \"squareFootage\" : squareFootage (com.zzheads.HomeAutomation.controller.RoomController.addRoom(RoomController.java:40))",

如您所见,字符“\”存在于字符串中。如何在没有那个的情况下在字符串中插入引号?

【问题讨论】:

  • 不要那样做。您应该使用 JSON 序列化程序。
  • 或将反斜杠加三倍以进行快速修复。
  • 我不明白 Json 有什么帮助?
  • 三个反斜杠没有帮助,同样的输出
  • 发布SSCCE / minimal reproducible example 让我们重现您的问题。还添加有关所需库/框架的信息。

标签: java json string double-quotes


【解决方案1】:

两件事:

A) 看起来您想要创建类似 JSON 的输出格式。然后:使用为您执行此操作的现有库;而不是重新发明轮子。

B) 考虑不在这里使用枚举。我猜你现在在很多地方都有这样的控制器类型切换。或者也许不是现在,但你可能很快就会拥有它们。这很简单:糟糕的 OO 设计!

您应该做的是:创建一个抽象类,并让每个控制器类型成为它的特定子类。最后,您的代码会执行类似

String controllerAsString = whatEverInstanceOfController.formatData();

或类似的东西。

【讨论】:

  • 我看到了一些我可以做我需要的其他方法,但是如何将带引号的静态字符串插入 json?无论如何我必须这样做,无论如何我会看到相同的结果
  • 如前所述;我很难理解你想做什么;以及为什么会这样。因此,也许有一种方法可以让您的示例更加简单;让我们明白你的意思。
【解决方案2】:

这确实是 Json 的东西,调试过的代码和: 在将响应发送为 Json 之前,响应包含在引号前没有丑陋反斜杠的字符串。当我使用 Postman 检查输出时,会出现反斜杠。

private class ApiErrorSerializer implements JsonSerializer<ApiError> {
    @Override
    public JsonElement serialize(ApiError src, Type typeOfSrc, JsonSerializationContext context) {
        Gson gson = new Gson();
        JsonObject result = new JsonObject();
        Date date = new Date();
        result.addProperty("timestamp", String.valueOf(new Timestamp(date.getTime())));
        result.addProperty("status", String.valueOf(src.getStatus()));
        if (src.getStatus() == 404) {
            result.addProperty("error", "Not Found");
        } else {
            result.addProperty("error", "Bad Request");
        }
        result.addProperty("exception", typeOfSrc.getTypeName());

        JsonPrimitive message = new JsonPrimitive(src.getMessage());
        //result.addProperty("message", src.getMessage());
        result.add("message", message);

        result.addProperty("path", src.getPath());
        return result;
    }
}

调试:当字符串转换为 JsonPrimitive 时,看起来它在引号前添加了反斜杠。 输出:

{
  "timestamp": "2016-08-21 19:45:12.157",
  "status": "400",
  "error": "Bad Request",
  "exception": "com.zzheads.HomeAutomation.exceptions.ApiErrorBadRequest",
  "message": "Can't make that request. Expected data format: {\"roomName\" : roomName, \"squareFootage\" : squareFootage} (com.zzheads.HomeAutomation.controller.RoomController.addRoom(RoomController.java:40))",
  "path": "/room"
}

【讨论】:

  • 完全正确。 JSON 字符串中的引号应该被反斜杠转义。你还想要什么?
  • 我不想在引号之前看到反斜杠,就像通常的字符串一样。示例: System.out.printf("Some text with \"quotes\"");输出:一些带有“引号”的文本。
  • 您看到的反斜杠与源代码中的反斜杠无关。正如我所说,它们在那里是因为反斜杠需要在 JSON 字符串中转义。否则,无法知道消息不是以roomName" 结尾。无论您使用什么来阅读和显示消息,都知道不显示反斜杠,所以真的没有问题。
猜你喜欢
  • 2013-03-09
  • 1970-01-01
  • 2023-04-09
  • 2022-08-17
  • 2010-12-11
  • 2019-05-02
  • 1970-01-01
  • 2012-11-17
  • 2020-04-15
相关资源
最近更新 更多