Преобразование JSON в карту <String>для каждого примитивного типа данных - PullRequest
1 голос
/ 15 мая 2019

Цель этого кода - преобразовать неизвестное количество параметров с неизвестным количеством значений в 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]]]>

1 Ответ

1 голос
/ 15 мая 2019

По умолчанию Jackson библиотека конвертирует JSON примитивы в подходящие типы. Рассмотрим пример ниже:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        String json = "{\"firstParam\":[1],\"secondParam\": [\"a\",\"b\",\"c\",\"d\"],\"thirdParam\": [1,2,3],\"fourthParam\":[true,false]}";

        ObjectMapper mapper = new ObjectMapper();
        Map<String, List<Object>> map = mapper.readValue(json, Map.class);
        map.forEach((k, v) -> {
            System.out.print(k + " => ");
            v.forEach(i -> System.out.print(i + " (" + i.getClass().getSimpleName() + "), "));
            System.out.println();
        });
    }
}

Над отпечатками кодов:

firstParam => 1 (Integer), 
secondParam => a (String), b (String), c (String), d (String), 
thirdParam => 1 (Integer), 2 (Integer), 3 (Integer), 
fourthParam => true (Boolean), false (Boolean), 

Но мы можем принудительно преобразовать элементы списка в String, предоставив тип, который нам нужен, используя TypeReference:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        String json = "{\"firstParam\":[1],\"secondParam\": [\"a\",\"b\",\"c\",\"d\"],\"thirdParam\": [1,2,3],\"fourthParam\":[true,false]}";

        TypeReference<LinkedHashMap<String, List<String>>> mapOfStringListsType = new TypeReference<LinkedHashMap<String, List<String>>>() {};
        ObjectMapper mapper = new ObjectMapper();
        Map<String, List<String>> map = mapper.readValue(json, mapOfStringListsType);
        map.forEach((k, v) -> {
            System.out.print(k + " => ");
            v.forEach(i -> System.out.print(i + " (" + i.getClass().getSimpleName() + "), "));
            System.out.println();
        });
    }
}

Над отпечатками кодов:

firstParam => 1 (String), 
secondParam => a (String), b (String), c (String), d (String), 
thirdParam => 1 (String), 2 (String), 3 (String), 
fourthParam => true (String), false (String), 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...