当前位置: 首页 > 知识库问答 >
问题:

如何避免链中每个微服务上的转义 /n?Java

郑伟彦
2023-03-14

例如,我们从我们的合作伙伴那里得到这样一条json消息:

{
"message": "Dear client,\nWe'd like to offer you.."
}

合作伙伴希望客户端接收这样的消息(没有换行符,但有\n

Dear client,\nWe'd like to offer you

但我们的生态系统中有一系列的微服务,json需要经过4到5个微服务,在客户端能够获得它之前进行处理。因此,我们的合作伙伴应该给我们\n,而不是\n,以便客户在结果中得到\n。但我想知道,在源消息中添加8个反斜杠来转义每个微服务的“\n”是否是解决此问题的唯一方法。我认为这不是一个很好的解决方案,因为如果链中的微服务数量发生变化,我们必须在源消息中进行更改(此外,如果链中的微服务数量开始动态变化,我们将面临这个问题)?有没有办法在源消息(来自合作伙伴)中使用\n,而不将我们微服务中的每个\n替换为\\n

下面是我如何在一个微服务中处理json的示例:

private String replace(String sourceJson, List<String> properties, DocumentContext context) {
    StringBuilder stringBuilder = new StringBuilder(sourceJson);

    for (String property : properties) {
        String newValue = Pattern.compile("ABC")
                .matcher(stringBuilder)
                .replaceAll(context.read(property, String.class));
        stringBuilder.replace(0, stringBuilder.length(), newValue);
    }
    return stringBuilder.toString();
}

共有1个答案

田玉韵
2023-03-14

下面是一个创建JSON对象的示例,将其转换为String,然后再转换为JsonObject,添加属性,然后再次将其转换为String。

package org.example;

import com.google.gson.Gson;
import com.google.gson.JsonObject;

public class App {
    public static void main(String[] args) {
        JsonObject o = new JsonObject();
        o.addProperty("message","foo\nbar");
        Gson gson = new Gson();
        String stringRep = gson.toJson(o);
        System.out.println(stringRep);
        JsonObject o2 = gson.fromJson(stringRep, JsonObject.class);
        o2.addProperty("newProp", 42);
        String messageValue = o2.get("message").getAsString();
        System.out.println(messageValue);
        String newMessageValue = messageValue.replace("foo", "baz");
        o2.addProperty("message", newMessageValue);
        stringRep = gson.toJson(o2);
        System.out.println(stringRep);
    }
}

这个程序的输出是:

{"message":"foo\nbar"}
foo
bar
{"message":"baz\nbar","newProp":42}

因此,您可以看到字符串的Java表示形式包含换行符,但JSON表示形式包含字符序列'\','n'

您需要的maven依赖项是:

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.9</version>
    </dependency>
 类似资料:
  • 你好,我有一个基于spring boot的后端,我们正在使用自己的库将JPA实体转换为DTO的(库基于反射工作)。问题是,我们将服务层直接注入到一些映射器中。假设我有一个和。UserDto有一个名为avatar的字段,化身存储在中。因此,为了构建UserDto,我们使用如下代码。 我不喜欢这种方法,因为Mapper必须对服务层一无所知。但是,这个映射器也被其他映射器使用。如果我想返回一个Order

  • 问题内容: 我想创建一个XML,其中用替换空白。但是Java-Transformer逃避了&符,因此输出为 这是我的示例代码: 这是我的示例代码的输出: 有任何解决或避免的想法吗?非常感谢! 问题答案: 将文本内容直接设置为所需的字符,如有必要,序列化程序将为您转义:

  • 我正在为自己建立一个虚拟助手,如果像这里举个例子,要求个人执行每一个命令是错误和无效的: 有没有更有效的方法来检查要执行的命令?

  • 我有两个微服务,它们应该相互通信。我的例子是:微服务A向微服务B发出请求。用户不应该有访问权限,只能访问其他微服务。我想,那个解决方案可能是“Http基本身份验证”,所以microservice A还应该向microservice B发送用户名和密码。这很好,但microservice A应该如何找到用户名和密码呢?我正在使用Eureka作为发现服务,但在这种情况下,我没有找到任何可以帮助我的。我

  • 我正在设计一个名为unlink Node的非静态无效方法,它将节点n作为参数。它应该确保节点与它之前和之后的节点解除链接。它需要改变n后节点的prev和n前节点的下一个。目前,当我运行它时,我得到了错误 第111行n.getPrev(). Next=null; 尽管我已经输入了语句,以确保如果n是尾部,则不访问它的上一个,如果是头部,则不访问它的下一个,以确保没有访问null。 方法如下: 以及设