Не проверено приведение к карте < String, Object > (JSON преобразован в карту с Джексоном)

Глядя на документацию Apple , Mozilla и Microsoft , функциональность, судя по всему, ограничивается обработкой только пар строк / значений.

Обходной путь может состоять в том, чтобы подкрепить ваш объект перед его сохранением, а затем проанализировать его при его получении:

var testObject = { 'one': 1, 'two': 2, 'three': 3 };

// Put the object into storage
localStorage.setItem('testObject', JSON.stringify(testObject));

// Retrieve the object from storage
var retrievedObject = localStorage.getItem('testObject');

console.log('retrievedObject: ', JSON.parse(retrievedObject));

2
задан norbjd 20 March 2019 в 12:41
поделиться

1 ответ

Вам необходимо использовать Object в качестве значения Map, поскольку это может быть другое значение Map, List или primitive (String, Integer и т. Д.). Jackson позволяет также манипулировать JSON с использованием типов JsonNode. Нам нужно пройти JSON object, а также JSON array (вы забыли об этом). В этом случае нам необходимо:

  • Десериализовать JSON - JsonNode.
  • Пройдите через JsonNode API.
  • Преобразование в Map

Простая реализация:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        String json = "{\"Key1\": \"value1\", \"Key2\": { \"Key2.1\": \"value2.1\" }, \"Key3\":[{\"pRiMe\":11}]}";
        Map<String, Object> map = convertJsonStringToMap(json);

        System.out.println(map);
    }

    private static Map<String, Object> convertJsonStringToMap(String json) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(json);
        transformKeys(node);

        TypeReference mapType = new TypeReference<Map<String, Object>>() {
        };

        return mapper.convertValue(node, mapType);
    }

    private static void transformKeys(JsonNode parent) {
        if (parent.isObject()) {
            ObjectNode node = (ObjectNode) parent;

            List<String> names = new ArrayList<>();
            node.fieldNames().forEachRemaining(names::add);

            names.forEach(name -> {
                JsonNode item = node.remove(name);
                transformKeys(item);
                node.replace(name.toLowerCase(), item);
            });
        } else if (parent.isArray()) {
            ArrayNode array = (ArrayNode) parent;
            array.elements().forEachRemaining(JsonApp::transformKeys);
        }
    }
}

Выше кода печатается:

{key1=value1, key2={key2.1=value2.1}, key3=[{prime=11}]}

Мы избавились от небезопасного литья и наша реализация более краткая.

0
ответ дан Michał Ziober 20 March 2019 в 12:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: