Reputation: 459
I have a PostRequest here that I want to be able to save data to different tables. About the @RequestBody I get a JsonString that I want to split to be able to execute an INSERT INTO query.
Here is my PostRequest:
@PostMapping(value = "/config/test/{tableName}/{schemaName}")
public String postValue(@RequestBody String values, @PathVariable("tableName") String tableName, @PathVariable("schemaName") String schemaName) {
String keyString = "";
String valueString = "";
final String sql = "INSERT INTO " + schemaName + "." + tableName + "(" + keyString + ") VALUES(" + valueString + ")";
final Query query = em.createNativeQuery(sql);
query.executeUpdate();
return values;
}
And here's my JSONString:
{
"id": 23,
"indexNummer": 4,
"indexName": "Gewichtung Alter Periode ohne Maßnahmen",
"minVal": 51.0,
"maxVal": 85.0,
"indexWert": 1
}
Is there any way to split my string so that my two strings keyString, valueString are filled as follows?
keyString = "id,indexNumber,indexName,minVal,maxVal,indexValue" valueString="23,4, "Is there any way to split my string so that my two strings keyString, valueString are filled as follows?
keyString = "id, indexNumber, indexName, minVal, maxVal, indexValue"
valueString="23, 4, "Gewichtung Alter Periode ohne Maßnahmen", 51.0, 85.0, 1"
Upvotes: 0
Views: 221
Reputation: 4604
Use com.fasterxml.jackson.databind.ObjectMapper
as below:
ObjectMapper mapper =new ObjectMapper();
String string="{\r\n"
+ " \"id\": 23,\r\n"
+ " \"indexNummer\": 4,\r\n"
+ " \"indexName\": \"Gewichtung Alter Periode ohne Maßnahmen\",\r\n"
+ " \"minVal\": 51.0,\r\n"
+ " \"maxVal\": 85.0,\r\n"
+ " \"indexWert\": 1\r\n"
+ "}";
TypeReference<HashMap<String, String>> typeRef = new TypeReference<HashMap<String, String>>() {
};
HashMap<String, String> map = mapper.readValue(string, typeRef);
String keys = map.keySet().stream().collect(Collectors.joining(","));
String values = map.values().stream().collect(Collectors.joining(","));
System.out.println(keys);
System.out.println(values);
Output :
indexNummer,maxVal,minVal,indexName,id,indexWert
4,85.0,51.0,Gewichtung Alter Periode ohne Maßnahmen,23,1
Upvotes: 0
Reputation: 336
You can convert JSONString into Map or you can directly read it is map and then do the following
@PostMapping(value = "/config/test/{tableName}/{schemaName}")
public Map postValue(@RequestBody Map<String, Object> values, @PathVariable("tableName") String tableName,
@PathVariable("schemaName") String schemaName) {
String keyString = "";
String valueString = "";
Set<String> keySet = values.keySet();
for (String key : keySet) {
// add comma after first key-value pair only.
if (keyString.length() > 0) {
keyString += ",";
valueString += ",";
}
keyString += key;
Object valueObj = values.get(key);
if (valueObj instanceof String) {
valueString = valueString + "\"" + valueObj.toString() + "\"";
} else if (valueObj instanceof Integer) {
Integer valueInt = (Integer) valueObj;
valueString = valueString + valueInt;
} else if (valueObj instanceof Double) {
Double valueDouble = (Double) valueObj;
valueString = valueString + valueDouble;
}
}
final String sql = "INSERT INTO " + schemaName + "." + tableName + "(" + keyString + ") VALUES(" + valueString + ")";
final Query query = em.createNativeQuery(sql);
query.executeUpdate();
return values;
}
Upvotes: 1