将字符串映射到 db 到 java 类



我有一个实体类(帐户),其中有一个名为权限的列,用于管理对我网站的访问。它在我的数据库中映射为字符串,如下所示:

@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),除了日志记录之外,这还需要一些清理操作。您应该尽量避免存储中的数据会持续导致错误。

相关内容

  • 没有找到相关文章

最新更新