3

我的数据如下所示:

{
    "status": "success",
    "data": {
        "irrelevant": {
            "serialNumber": "XYZ",
            "version": "4.6"
        },
        "data": {
            "lib": {
                "files": [
                    "data1",
                    "data2",
                    "data3",
                    "data4" 
                ],
                "another file": [
                    "file.jar",
                    "lib.jar" 
                ],
                "dirs": []
            },
            "jvm": {
                "maxHeap": 10,
                "maxPermSize": "12"
            },
            "serverId": "134",
            "version": "2.3"
        }
    }
}

这是我用来美化 JSON 数据的函数:

public static String stringify(Object o, int space) {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(o);
    } catch (Exception e) {
        return null;
    }
}

我正在使用 Jackson JSON 处理器将 JSON 数据格式化为字符串。由于某种原因,JSON 格式不是我需要的格式。将数据传递给该函数时,我得到的格式是:

{
    "status": "success",
    "data": {
        "irrelevant": {
            "serialNumber": "XYZ",
            "version": "4.6"
        },
        "another data": {
            "lib": {
                "files": [ "data1", "data2", "data3", "data4" ],
                "another file": [ "file.jar", "lib.jar" ],
                "dirs": []
            },
            "jvm": {
                "maxHeap": 10,
                "maxPermSize": "12"
            },
            "serverId": "134",
            "version": "2.3"
        }
    }
}

正如您在“另一个数据”对象下看到的那样,数组显示为一整行,而不是数组中每个项目的新行。我不确定如何修改我的 stringify 函数以正确格式化 JSON 数据。

4

2 回答 2

5

您应该检查DefaultPrettyPrinter的外观。这个类中真正有趣的是_arrayIndenter属性。此属性的默认值为FixedSpaceIndenter类。您应该使用Lf2SpacesIndenter类更改它。

您的方法应如下所示:

public static String stringify(Object o) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
        printer.indentArraysWith(new Lf2SpacesIndenter());
        return mapper.writer(printer).writeValueAsString(o);
    } catch (Exception e) {
        return null;
    }
}
于 2013-07-01T23:12:56.667 回答
3

我没有足够的声誉来添加评论,但是
Lf2SpacesIndenter从较新的 Jackson 的 API(2.7 及更高版本)中删除了对上述答案的引用,因此请改用:

printer.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);

解决方案的来源

于 2020-08-26T09:57:59.230 回答