我有一个实体类(帐户),其中有一个名为权限的列,用于管理对我网站的访问。它在我的数据库中映射为字符串,如下所示:
@Column(length = 300)
private String permissions;
实际上,此字段包含一个 json 字符串,例如:
{"permissionOne" : true, "permissionTwo" : false}
该字段未映射为 JSON,因为我的数据库是旧版本的 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);
权限变量为空。
我不知道为什么。似乎一切都很好。我错过了什么吗?
我可以用不同的方式做到这一点吗?谢谢!
从我在这段代码中看到的内容来看:
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
参数为 null。除此之外,您还可以在此处使用 Java 8 的 Optional 作为返回值。
在另一种情况下,数据库中可能有一些垃圾(不可读的 JSON),除了日志记录之外,这还需要一些清理操作。您应该尽量避免存储中的数据会持续导致错误。