в 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 2

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