Java 根据数据库记录(占位符)从动态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"

在这段代码中,我需要根据数据库记录从动态json对象中获取值。我在数据库中有两个表,称为notification和Placeholder多对多关系,notification可以包含动态占位符数,一个服务将向该服务发送json post请求,以便用实际值替换占位符,但由于该服务不知道动态占位符数是多少值应该从动态json数组中获取,但json对象包含通知id,使用通知id我可以获取通知对象和相应的占位符,然后我可以从json对象中获取实际值

{  
    "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());
    }

}