如何避免在链中的每个微服务上转义 /n? Java
How to avoid escaping /n on each microservice in the chain? Java
例如,我们从我们的合作伙伴那里收到了这样一条 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();
}
下面是一个创建 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>
例如,我们从我们的合作伙伴那里收到了这样一条 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();
}
下面是一个创建 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>