我有一个实体类(帐户),其中包含一个名为permission的列,用于管理我网站上的访问权限。它在我的数据库中映射为字符串,如下所示:
@Column(length = 300)
private String permissions;
实际上,这个字段包含一个json字符串,例如:
{"permissionOne" : true, "permissionTwo" : false}
该字段未映射为JSON,因为我的db是MySql,版本较旧,不支持JSON类型,我无法更改版本。
我还有一个JsonHelper类:
public class JsonHelper {
/** Singleton parser instance */
private static ObjectMapper parser = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.enable(Feature.ALLOW_UNQUOTED_FIELD_NAMES, Feature.ALLOW_UNQUOTED_CONTROL_CHARS);
/** Logger instance */
private static Logger LOG = LoggerFactory.getLogger(JsonHelper.class);
/**
* converts one java object into json {@link String}g
*
* @param toConvert
* @return converted {@link String} object
*/
public static String toJsonString(Object toConvert) {
String result = null;
try {
result = parser.writeValueAsString(toConvert);
}
catch (JsonProcessingException e) {
LOG.error("Cannot parse value : " + toConvert + " StackTrace : ", e);
}
return result;
}
/**
* Converts one json {@link String} into java object
*
* @param toConvert json string to convert
* @param convertType class type to be converted into
* @return converted java object
*/
public static <T> T fromJsonString(String toConvert, Class<T> convertType) {
if (toConvert == null) return null;
T result = null;
try {
result = parser.readValue(toConvert, convertType);
}
catch (IOException e) {
LOG.error("Cannot parse value : " + convertType + " " + toConvert + " StackTrace : ", e);
}
return result;
}
/**
* Converts one java object to {@link JsonNode}
*
* @param toConvert object to convert
* @return converted json object
*/
public static JsonNode toJsonNode(Object toConvert) {
return parser.valueToTree(toConvert);
}
/**
* Converts one {@link JsonNode} into java object
*
* @param toConvert to be converted
* @param convertType type of class to convert to
* @return converted java object
*/
public static <T> T fromJsonNode(JsonNode toConvert, Class<T> convertType) {
T result = null;
try {
result = parser.treeToValue(toConvert, convertType);
}
catch (JsonProcessingException e) {
LOG.error("Cannot parse value : " + convertType + " " + toConvert +
" StackTrace : ", e);
}
return result;
}
/**
* Converts one json into list of objects
*
* @param toConvert json to convert
* @param convertType list type
* @return converted liist with objects
*/
public static <T> List<T> fromJsonNodeList(JsonNode toConvert, Class<T>
convertType) {
List<T> result = new ArrayList<>();
if (!toConvert.isArray()) return result;
for (JsonNode node : toConvert) {
result.add(fromJsonNode(node, convertType));
}
return result;
}
public static ObjectMapper getParser() {
return parser;
}
}
当我这样做时:
Permission permission = JsonHelper.fromJsonString(account.getPermissions(), Permission.class);
权限变量为空。
我不知道为什么。看起来一切都很好。 我错过了什么吗?
我可以用不同的方式吗? 谢谢!
答案 0 :(得分:0)
从我在这段代码中看到的情况来看:
public static <T> T fromJsonString(String toConvert, Class<T> convertType) {
if (toConvert == null) return null;
T result = null;
try {
result = parser.readValue(toConvert, convertType);
}
catch (IOException e) {
LOG.error("Cannot parse value : " + convertType + " " + toConvert + " StackTrace : ", e);
}
return result;
}
此方法只能在null
为toConvert
的情况下返回null
,否则解析器无法读取该值。
如果toConvert
是null
是可接受的选项(假设permissions
字段确实是可选的)。您应该记录toConvert
参数为空的警告。除此之外,你可以在这里使用Java 8的Optional作为返回值。
在另一种情况下,数据库中可能存在一些垃圾(不可读的JSON),除了记录之外,还需要一些清理操作。您应该尽量避免在存储中存储会持续导致错误的数据。