Цель этого кода - преобразовать неизвестное количество параметров с неизвестным количеством значений в Map<String, List<String>>
(ключ - имя параметра, значение - список возможных значений параметров), предполагая, что каждый тип типа будет анализировать в String .
Проблема в том, что числа и другие форматы не разбираются в строку, и jsonField.getValue()
не является узлом значения (jsonField.getValue().isValueNode()
возвращает false
), поэтому я не могу использовать jsonField.getValue().asText()
, так как он возвращает null
.
Мой подход:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.collections4.map.ListOrderedMap;
public ListOrderedMap<String, ArrayList<String>> convertParamsFromJson(String jsonParams) throws IOException {
ListOrderedMap<String, ArrayList<String>> convertedParams = new ListOrderedMap<>();
Iterator<Entry<String, JsonNode>> fieldsFromJson = convertFromJson(jsonParams).fields();
ObjectMapper mapper = new ObjectMapper();
while (fieldsFromJson.hasNext()) {
Entry<String, JsonNode> jsonField = fieldsFromJson.next();
String paramName = jsonField.getKey();
String paramValue = jsonField.getValue();
if (jsonField.getValue().isArray()) {
convertedParams.put(paramName, mapper.convertValue(paramValue, ArrayList.class));
}
}
return convertedParams;
}
ввод:
{
"firstParam":[1],
"secondParam": ["a","b","c","d"],
"thirdParam": [1,2,3],
"fourthParam":[true,false]
}
ожидаемый результат:
<[MapEntry[key="firstparam", value=["1"]],
MapEntry[key="secondparam", value=["a","b","c","d"]],
MapEntry[key="thirdparam", value=["1","2","3"]],
MapEntry[key="fourthparam", value=["true", "false"]]]>
* * Тысяча двадцать-одина выход:
<[MapEntry[key="firstparam", value=[1]],
MapEntry[key="secondparam", value=["a", "b", "c", "d"]],
MapEntry[key="thirdparam", value=[1,2,3]],
MapEntry[key="fourthparam", value=[true, false]]]>