将字符串映射到db到java类

时间:2017-11-03 14:52:24

标签: java jackson objectmapper

我有一个实体类(帐户),其中包含一个名为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);

权限变量为空。

我不知道为什么。看起来一切都很好。 我错过了什么吗?

我可以用不同的方式吗? 谢谢!

1 个答案:

答案 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;
}

此方法只能在nulltoConvert的情况下返回null,否则解析器无法读取该值。

如果toConvertnull是可接受的选项(假设permissions字段确实是可选的)。您应该记录toConvert参数为空的警告。除此之外,你可以在这里使用Java 8的Optional作为返回值。

在另一种情况下,数据库中可能存在一些垃圾(不可读的JSON),除了记录之外,还需要一些清理操作。您应该尽量避免在存储中存储会持续导致错误的数据。