Глядя на документацию 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));
Вам необходимо использовать 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}]}
Мы избавились от небезопасного литья и наша реализация более краткая.