Java 根据数据库记录(占位符)从动态json对象获取值(实值),并用实值替换占位符
在这段代码中,我需要根据数据库记录从动态json对象中获取值。我在数据库中有两个表,称为notification和Placeholder多对多关系,notification可以包含动态占位符数,一个服务将向该服务发送json post请求,以便用实际值替换占位符,但由于该服务不知道动态占位符数是多少值应该从动态json数组中获取,但json对象包含通知id,使用通知id我可以获取通知对象和相应的占位符,然后我可以从json对象中获取实际值Java 根据数据库记录(占位符)从动态json对象获取值(实值),并用实值替换占位符,java,json,string,spring-boot,replace,Java,Json,String,Spring Boot,Replace,在这段代码中,我需要根据数据库记录从动态json对象中获取值。我在数据库中有两个表,称为notification和Placeholder多对多关系,notification可以包含动态占位符数,一个服务将向该服务发送json post请求,以便用实际值替换占位符,但由于该服务不知道动态占位符数是多少值应该从动态json数组中获取,但json对象包含通知id,使用通知id我可以获取通知对象和相应的占位符,然后我可以从json对象中获取实际值 { "messageId"
{
"messageId":9,
"msisdn":"94763703355",
"<PACKNAME>":"Youtube",
"<PACKTYPE>":"Social Media",
}
下面是动态json对象
{
"messageId":9,
"msisdn":"94763703355",
"<PACKNAME>":"Youtube",
"<PACKTYPE>":"Social Media",
}
所有占位符都应替换为相关值,但我无法获得预期的输出
@服务
公共类NotificationServiceImpl实现NotificationService{
@Autowired
RestTemplate restTemplate;
@Autowired
NotificationRepository notificationRepository;
@Override
public void getdata(String dynamicJson) throws IOException {
// create object mapper instance
ObjectMapper mapper = new ObjectMapper();
// convert JSON string to Java Object
DynamicJson dynamicJson1 = mapper.readValue(dynamicJson, DynamicJson.class);
// print user object
//System.out.println(dynamicJson1);
int id = dynamicJson1.getMessageId();
Optional<Notification> notification = notificationRepository.findById(id);
List<PlaceHolder> placeHolders = notification.get().getPlaceHolders();
Map<String, String> replacements = new HashMap<String, String>();
placeHolders.forEach(i -> replacements.put(i.getValue(), dynamicJson1.getPlaceholders().get(i).toString()));
String message = notification.get().getMessage();
StringBuilder result = new StringBuilder(message.length());
String delimiters = "+-*/(),. ";
StringTokenizer st = new StringTokenizer(message, delimiters, true);
while (st.hasMoreTokens()) {
String w = st.nextToken();
if (replacements.containsKey(w)) {
result.append(replacements.get(w));
} else {
result.append(w);
}
}
System.out.println(result.toString());
}
}
这就是我得到的输出
You have succuessfully subscribed to Youtube and it will be <PACKTYPE> package
You have succuessfully subscribed to <PACKNAME> and it will be Social Media package
占位符和realValue元素计数是动态的,1到n是外部for循环。您可以在占位符上循环。您应该将占位符放在地图中,其值为realValue。类似如下:
Map<String, String> replacements = new HashMap<String, String>();
placeHolders.forEach(i -> replacements.put(i, dynamicJson1.getPlaceholders().get(i).toString()));
String sentence = "You have succuessfully subscribe to <PACKNAME> and it will be <PACKTYPE> package";
StringBuilder result = new StringBuilder(sentence.length());
String delimiters = "+-*/(),. ";
StringTokenizer st = new StringTokenizer(sentence, delimiters, true);
while (st.hasMoreTokens()) {
String w = st.nextToken();
if (replacements.containsKey(w)) {
result.append(replacements.get(w));
} else {
result.append(w);
}
}
System.out.println(result.toString());
这是外部for循环。您在占位符上循环。您应该将占位符放在地图中,其值为realValue。类似如下:
Map<String, String> replacements = new HashMap<String, String>();
placeHolders.forEach(i -> replacements.put(i, dynamicJson1.getPlaceholders().get(i).toString()));
String sentence = "You have succuessfully subscribe to <PACKNAME> and it will be <PACKTYPE> package";
StringBuilder result = new StringBuilder(sentence.length());
String delimiters = "+-*/(),. ";
StringTokenizer st = new StringTokenizer(sentence, delimiters, true);
while (st.hasMoreTokens()) {
String w = st.nextToken();
if (replacements.containsKey(w)) {
result.append(replacements.get(w));
} else {
result.append(w);
}
}
System.out.println(result.toString());
我所做的就是将字符串生成器替换代码部分放在for循环的外面,并使用Hashmap映射占位符和realValue,这样就可以解决这个问题
@Override
public void getdata(String dynamicJson) throws IOException {
// create object mapper instance
ObjectMapper mapper = new ObjectMapper();
// convert JSON string to Java Object
DynamicJson dynamicJson1 = mapper.readValue(dynamicJson, DynamicJson.class);
int id = dynamicJson1.getMessageId();
Optional<Notification> notification = notificationRepository.findById(id);
List<PlaceHolder> placeHolders = notification.get().getPlaceHolders();
//Changed
HashMap<String, String> hash_map = new HashMap<String, String>();
String message = notification.get().getMessage();
for (int i = 0; i < placeHolders.size(); i++) {
String placeholder = placeHolders.get(i).getValue();
String realValue = dynamicJson1.getPlaceholders().get(placeholder).toString();
//Changed
hash_map.put(placeholder, realValue);
}
//////////////////////////////////////////////////////////////////////////////////
StringBuilder result = new StringBuilder(message.length());
String delimiters = "+-*/(),. ";
StringTokenizer st = new StringTokenizer(message, delimiters, true);
while (st.hasMoreTokens()) {
String w = st.nextToken();
if (hash_map.containsKey(w)) {
result.append(hash_map.get(w));
} else {
result.append(w);
}
}
System.out.println(result.toString());
}
}
@覆盖
公共void getdata(字符串dynamicJson)引发IOException{
//创建对象映射器实例
ObjectMapper mapper=新的ObjectMapper();
//将JSON字符串转换为Java对象
DynamicJson dynamicJson1=mapper.readValue(DynamicJson,DynamicJson.class);
int id=dynamicJson1.getMessageId();
可选通知=notificationRepository.findById(id);
列表占位符=notification.get().getPlaceHolders();
//改变
HashMap hash_map=新HashMap();
字符串消息=notification.get().getMessage();
对于(int i=0;i
我可以解决这个问题,我所做的是将字符串生成器替换代码部分放在for循环的外面,并使用Hashmap映射占位符和realValue
@Override
public void getdata(String dynamicJson) throws IOException {
// create object mapper instance
ObjectMapper mapper = new ObjectMapper();
// convert JSON string to Java Object
DynamicJson dynamicJson1 = mapper.readValue(dynamicJson, DynamicJson.class);
int id = dynamicJson1.getMessageId();
Optional<Notification> notification = notificationRepository.findById(id);
List<PlaceHolder> placeHolders = notification.get().getPlaceHolders();
//Changed
HashMap<String, String> hash_map = new HashMap<String, String>();
String message = notification.get().getMessage();
for (int i = 0; i < placeHolders.size(); i++) {
String placeholder = placeHolders.get(i).getValue();
String realValue = dynamicJson1.getPlaceholders().get(placeholder).toString();
//Changed
hash_map.put(placeholder, realValue);
}
//////////////////////////////////////////////////////////////////////////////////
StringBuilder result = new StringBuilder(message.length());
String delimiters = "+-*/(),. ";
StringTokenizer st = new StringTokenizer(message, delimiters, true);
while (st.hasMoreTokens()) {
String w = st.nextToken();
if (hash_map.containsKey(w)) {
result.append(hash_map.get(w));
} else {
result.append(w);
}
}
System.out.println(result.toString());
}
}
@覆盖
公共void getdata(字符串dynamicJson)引发IOException{
//创建对象映射器实例
ObjectMapper mapper=新的ObjectMapper();
//将JSON字符串转换为Java对象
DynamicJson dynamicJson1=mapper.readValue(DynamicJson,DynamicJson.class);
int id=dynamicJson1.getMessageId();
可选通知=notificationRepository.findById(id);
列表占位符=notification.get().getPlaceHolders();
//改变
HashMap hash_map=新HashMap();
字符串消息=notification.get().getMessage();
对于(int i=0;i
您是否尝试过使用调试器单步执行代码?是的,但我无法找出出错的原因。这是您的外部for循环。在占位符上循环。您应该将占位符放在一个映射中,其值为realvalues。您是否尝试过使用调试器单步执行代码?是的,但我无法找出出错的原因。这是您的外部for循环。在占位符上循环。你应该把你的占位符放在一个地图上,值是realvalues,我直接替换了你的核心,因为我对lamda没有太多经验,它要求输入字符串,但提供的类型是占位符替换exception@HashanR,您得到了什么异常?“跟踪”:“java.lang.NullPointerException\r\n\tat com.hashanr.notificationsender.service.NotificationServiceImpl.lambda$getdata$0(NotificationServiceImpl.java:66)\r\n\tat java.lang.Iterable.forEach(Iterable.java:75)\r\n\tat com.hashanr.notificationsender.service.NotificationServiceImpl.getdata(NotificationServiceImpl.java:66)\r\n\t com.hashanr.notificationsender.controller.NotificationController.getObject(NotificationController.java:28)\r\n\t sun.reflect.NativeMethodAccessorImpl.i
Map<String, String> replacements = new HashMap<String, String>();
placeHolders.forEach(i -> replacements.put(i, dynamicJson1.getPlaceholders().get(i).toString()));
String sentence = "You have succuessfully subscribe to <PACKNAME> and it will be <PACKTYPE> package";
StringBuilder result = new StringBuilder(sentence.length());
String delimiters = "+-*/(),. ";
StringTokenizer st = new StringTokenizer(sentence, delimiters, true);
while (st.hasMoreTokens()) {
String w = st.nextToken();
if (replacements.containsKey(w)) {
result.append(replacements.get(w));
} else {
result.append(w);
}
}
System.out.println(result.toString());
for(String placeHolder: placeHolders) {
replacements.put(placeHolder, dynamicJson1.getPlaceholders().get(placeHolder).toString()))
}
@Override
public void getdata(String dynamicJson) throws IOException {
// create object mapper instance
ObjectMapper mapper = new ObjectMapper();
// convert JSON string to Java Object
DynamicJson dynamicJson1 = mapper.readValue(dynamicJson, DynamicJson.class);
int id = dynamicJson1.getMessageId();
Optional<Notification> notification = notificationRepository.findById(id);
List<PlaceHolder> placeHolders = notification.get().getPlaceHolders();
//Changed
HashMap<String, String> hash_map = new HashMap<String, String>();
String message = notification.get().getMessage();
for (int i = 0; i < placeHolders.size(); i++) {
String placeholder = placeHolders.get(i).getValue();
String realValue = dynamicJson1.getPlaceholders().get(placeholder).toString();
//Changed
hash_map.put(placeholder, realValue);
}
//////////////////////////////////////////////////////////////////////////////////
StringBuilder result = new StringBuilder(message.length());
String delimiters = "+-*/(),. ";
StringTokenizer st = new StringTokenizer(message, delimiters, true);
while (st.hasMoreTokens()) {
String w = st.nextToken();
if (hash_map.containsKey(w)) {
result.append(hash_map.get(w));
} else {
result.append(w);
}
}
System.out.println(result.toString());
}
}