/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.storage.json;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
/**
* This StringObjectMapDeserializer deserializes a Map with String -> Object and replaces all numbers with BigDecimals.
* WARNING: Objects MUST NOT be more complex than Java primitives and Strings.
*
* @author Stefan Triller - Initial Contribution
*/
public class StringObjectMapDeserializer implements JsonDeserializer<Map<String, Object>> {
@Override
public Map<String, Object> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
Map<String, Object> map = new HashMap<String, Object>();
JsonObject obj = json.getAsJsonObject();
for (Map.Entry<String, JsonElement> me : obj.entrySet()) {
String k = me.getKey();
JsonElement v = me.getValue();
if (v.isJsonPrimitive() && ((JsonPrimitive) v).isNumber()) {
map.put(k, v.getAsBigDecimal());
} else {
Object value = context.deserialize(v, Object.class);
map.put(k, value);
}
}
return map;
}
}