в Java конвертировать массив почтовая форма для JSON-объект или объект POJO или карту
У меня есть строка запроса POST следующего формата:
Param1=aaa&inners[0] ["innerParam"]=bbb&inners[1] ["innerParam"]=nnn
Мне нужно легко преобразовать его в карту или POJO.
public class pojo{
private String param1;
private List<OtherPojo> inners;//array is also ok
//getters etc
}
class OtherPojo{
private String innerParam.
//getters etc
}
Я думал, что это может быть сделано Jersey @BeanParam или sth еще, но, к сожалению, это невозможно. Поэтому у меня просто есть строка, и мне нужно скомпилировать ее для map или pojo. Обратите внимание, что мне не ясно, как разобрать эту конструкцию
inners[0]["innerParam"]
Я бы не хотел делать это вручную. Поэтому мне нужно разобрать его желательно в одну строку.
Pojo p=someHelper.compileToPojo(postString);// or map
Какой lib использовать, если он существует?
1 ответ:
Библиотека, которую вы можете использовать:
com.fasterxml.jackson
А вот как это можно было бы реализовать:
public void checkAndSetChildValues(ObjectNode node, String field, String value, ObjectMapper mapper) { int indexDot = field.indexOf('.'); if (indexDot > -1) { String childFieldName = field.substring(0, indexDot); ObjectNode child = node.with(childFieldName); checkAndSetChildValues(child, field.substring(indexDot + 1), value, mapper); } else { try{ node.set(field, mapper.convertValue(value, JsonNode.class)); } catch(IllegalArgumentException ex){ logger.debug("could not parse value {} for field {}", value, field); } } } public Object parse(Class type, String entityString) throws UnsupportedEncodingException { ObjectMapper mapper = mapperHolder.get(); ObjectNode node = mapper.createObjectNode(); Scanner s = new Scanner(entityString).useDelimiter("&|="); while (s.hasNext()) { String key = s.next(); String value = s.hasNext() ? URLDecoder.decode(s.next(), "UTF-8") : null; checkAndSetChildValues(node, key, value, mapper); } Object result = mapper.convertValue(node, type); return result; }
Таким образом, вы должны быть в состоянии реализовать собственный
javax.ws.rs.ext.MessageBodyReader
см.: https://jersey.java.net/documentation/latest/message-body-workers.html#d0e7151