无法通过gson反序列化json文件

时间:2013-06-27 21:34:29

标签: java gson

我有一个json文件

{
    "l": {
        "default_level": "...",
        "impl": "...",
        "levels": [
            ...,
            ...
        ]
    },
    "a": [
        {
            "format": "...",
            "filename": "...",
            "rotation": "...",
            "ls": [
                ...,
                ...
            ]
        }
    ]
}

我想要映射到

public class ABC {

    private List<A> aList = new ArrayList<>();
    private L lConfig = new L();

    // Gettters and Setters for aList and l

    public static class L {
        String default_level;
        String impl;

        List<String> levels = new ArrayList<>();

        // Gettters and Setters

        @Override
        public String toString() {
            // ...
        }
    }

    public static class A {
        String format;
        String filename;
        String rotation;

        List<String> ls = new ArrayList<>();

        // Getters and Setters

        @Override
        public String toString() {
            // ...
        }
    }
}

正在反序列化

public static BLAH load(String externalConfigFile) throws IOException {
    ABC config = null;

    Path path = Paths.get(externalConfigFile);
    if (Files.exists(path) || Files.isReadable(path)) {
        config = new Gson().fromJson(readFile(externalConfigFile), ABC.class);
    }

    return config;
}

哪,打印后给我

A[] 
L{default_level='null', impl='null', levels=[]}

为什么没有设置东西?

2 个答案:

答案 0 :(得分:2)

我认为问题只是属性的名称。在Gson中,属性的名称必须与JSON中的字段名称匹配。

因此,您需要更改ABC类中属性的名称。类似的东西:

public class ABC {

    private List<A> a;
    private L l;

    //All the rest is okay...
}

否则,您应该使用注释@SerializedName,如下所示:

@SerializedName("a")
private List<A> aList;
@SerializedName("l")
private L lConfig;

答案 1 :(得分:0)

尝试使用数组而不是列表:

private A[] aList = {};

列表&lt; A&gt;会失去它的&lt; A&gt;在运行期间,gson不知道它应该映射你提供它的JSON数组。