Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java中的属性文件创建具有嵌套字段的映射或对象_Java_Json_Properties - Fatal编程技术网

从Java中的属性文件创建具有嵌套字段的映射或对象

从Java中的属性文件创建具有嵌套字段的映射或对象,java,json,properties,Java,Json,Properties,我需要从带有嵌套字段的属性文件创建JSON? 例如,我们有以下属性文件: student.name="John" student.exam.math=5 teacher.skills=10 我需要输出以下JSON文件: Properties : { student : { name : "John", exam : { math : 5 } }, teacher : { skills

我需要从带有嵌套字段的属性文件创建JSON? 例如,我们有以下属性文件:

student.name="John"
student.exam.math=5
teacher.skills=10
我需要输出以下JSON文件:

Properties : {
    student : {
        name : "John",
        exam : {
            math : 5
        }
    },
    teacher : {
       skills : 10
    }
}

JSON代码可以使用FLEX-JSON序列化程序或GSON库生成,这不是问题。主要问题是解析属性并生成具有嵌套属性的Java对象或映射。有允许这样做的图书馆吗?谢谢

顺便说一句,目前还没有知名的图书馆可以做到这一点。但你可以用一种简单的方式来做:

 public String propertiesToJson(Properties p) {
    Map tree = new LinkedHashMap();

    for (String name : p.stringPropertyNames()) {
        String[] parts = name.split("\\.");
        Map nextTree = tree;
        for (int i = 0, partsLength = parts.length; i < partsLength; i++) {
            String part = parts[i];
            Object v = nextTree.get(part);
            if (v == null) {
                if (i < partsLength - 1) {
                    Map newNextTree = new LinkedHashMap();
                    nextTree.put(part, newNextTree);
                    nextTree = newNextTree;
                } else {
                    nextTree.put(part, p.getProperty(name));
                }
            } else {
                if (i < partsLength - 1) {
                    nextTree = (Map) v;
                }
            }
        }
    }


    StringBuilder sb = new StringBuilder();
    sb.append("Properties : {\n");
    recursive(tree, sb, 1);
    sb.append("}");

    return sb.toString();
}

private void recursive(Map tree, StringBuilder sb, int deep) {
    boolean first = true;
    for (Object key : tree.keySet()) {
        if (!first) sb.append(",\n");
        else first = false;
        for (int t = 0; t < deep; t++) sb.append("\t");
        sb.append(key + " : ");
        Object v = tree.get(key);
        if (v instanceof Map) {
            sb.append("{\n");
            recursive((Map) v, sb, deep+1);
            for (int t = 0; t < deep; t++) sb.append("\t");
            sb.append("}");
        } else {
            sb.append(v);
        }
    }
    sb.append("\n");
}

顺便说一句,没有知名的图书馆可以这样做。但你可以用一种简单的方式来做:

 public String propertiesToJson(Properties p) {
    Map tree = new LinkedHashMap();

    for (String name : p.stringPropertyNames()) {
        String[] parts = name.split("\\.");
        Map nextTree = tree;
        for (int i = 0, partsLength = parts.length; i < partsLength; i++) {
            String part = parts[i];
            Object v = nextTree.get(part);
            if (v == null) {
                if (i < partsLength - 1) {
                    Map newNextTree = new LinkedHashMap();
                    nextTree.put(part, newNextTree);
                    nextTree = newNextTree;
                } else {
                    nextTree.put(part, p.getProperty(name));
                }
            } else {
                if (i < partsLength - 1) {
                    nextTree = (Map) v;
                }
            }
        }
    }


    StringBuilder sb = new StringBuilder();
    sb.append("Properties : {\n");
    recursive(tree, sb, 1);
    sb.append("}");

    return sb.toString();
}

private void recursive(Map tree, StringBuilder sb, int deep) {
    boolean first = true;
    for (Object key : tree.keySet()) {
        if (!first) sb.append(",\n");
        else first = false;
        for (int t = 0; t < deep; t++) sb.append("\t");
        sb.append(key + " : ");
        Object v = tree.get(key);
        if (v instanceof Map) {
            sb.append("{\n");
            recursive((Map) v, sb, deep+1);
            for (int t = 0; t < deep; t++) sb.append("\t");
            sb.append("}");
        } else {
            sb.append(v);
        }
    }
    sb.append("\n");
}

尽管这篇文章比较老,但一个非常简单的解决方案是使用Jackson JavaPropsMapper:


尽管这篇文章比较老,但一个非常简单的解决方案是使用Jackson JavaPropsMapper:


谢谢我来试试。谢谢!我想试试这个。