将List转换为JSON

时间:2014-12-03 01:09:21

标签: java json

我已经在我的Wordpress网站上开发了一个钩子,我可以在其中更新来自其他应用程序的信息。我正在使用一个需要特定JSON数据结构的特定插件。我的Java编程技巧有点生疏,所以我希望有人可以帮助我采取以下列表:

+------+-------+-----+-------+
| Year | Month | Day | Value |
+------+-------+-----+-------+
| 2014 |    12 |  22 |     1 |
| 2014 |    12 |  23 |     1 |
| 2014 |    12 |  24 |     1 |
| 2014 |    12 |  25 |     1 |
| 2014 |    12 |  26 |     1 |
| 2015 |     1 |   5 |     1 |
| 2015 |     1 |   6 |     1 |
| 2015 |     1 |   7 |     1 |
| 2015 |     1 |   8 |     1 |
| 2015 |     1 |   9 |     1 |
| 2015 |     1 |  19 |     1 |
| 2015 |     1 |  20 |     1 |
| 2015 |     1 |  21 |     1 |
| 2015 |     1 |  22 |     1 |
| 2015 |     1 |  23 |     1 |
| 2015 |     2 |   2 |     1 |
| 2015 |     2 |   3 |     1 |
| 2015 |     2 |   4 |     1 |
| 2015 |     2 |   5 |     1 |
| 2015 |     2 |   6 |     1 |
+------+-------+-----+-------+

并将其转换为以下JSON结构:

{
    "2014": {
        "12": {
            "22": "1",
            "23": "1",
            "24": "1",
            "25": "1",
            "26": "1"
        }
    },
    "2015": {
        "1": {
            "5": "1",
            "6": "1",
            "7": "1",
            "8": "1",
            "9": "1",
            "19": "1",
            "20": "1",
            "21": "1",
            "22": "1",
            "23": "1"
        },
        "2": {
            "2": "1",
            "3": "1",
            "4": "1",
            "5": "1",
            "6": "1"
        }
    }
}

非常感谢任何帮助。

修改

我已经创建了以下嵌套的地图,但我需要正确的结构来返回指定格式的数据

Map<String, Map<String, Map<String, String>>> map = new HashMap<>();
map.put("2014", new HashMap(){{put("12",new HashMap(){{put("22","1");}});}});
map.put("2014", new HashMap(){{put("12",new HashMap(){{put("23","1");}});}});
map.put("2014", new HashMap(){{put("12",new HashMap(){{put("24","1");}});}});
map.put("2014", new HashMap(){{put("12",new HashMap(){{put("25","1");}});}});
map.put("2014", new HashMap(){{put("12",new HashMap(){{put("26","1");}});}});


JSONObject json = new JSONObject(map);
System.out.print(json.toString());

3 个答案:

答案 0 :(得分:0)

这取决于您实际意味着用作输入的内容。你的&#34;列表&#34;正如你所提供的,它实际上是一个文本表。如果要从每一行中提取实际数字,可以使用这样的JS正则表达式:

row = s.match(/\d+/g)

其中s是文本输入的一行。如果它是包含您实际数据的行,row将有length === 4,您可以将这些数据传递给这样的函数,以将其添加到您的数据中:

var data = {};

function addDay(y, m, d, v) {
    if (!data.hasOwnProperty(y)) {
        data[y] = {};
    }
    if (!data[y].hasOwnProperty(m)) {
        data[y][m] = {};
    }   
    data[y][m][d] = v;
}   

通过为表格的每一行重复调用row(a[0], a[1], a[2], a[3]),您应该按照自己的方式构建对象data

我希望有更优雅的方法来做到这一点(例如,避免将数据作为全局变量),但这应该有效。

答案 1 :(得分:0)

使用这些依赖项 jackson-databind
jackson-annotations
jackson-core

public class JsonTest {
    public static void main(String[] args) throws JsonProcessingException {
    ObjectMapper mapper=new ObjectMapper();
    Map<String,String> dt=new Hashtable();
    dt.put("1", "welcome");
    dt.put("2", "bye");
    String jsonString = mapper.writeValueAsString(dt)
    System.out.println(jsonString);
    }    
}

这就是你想要的。

答案 2 :(得分:0)

使用以下内容:

    HashMap<String, HashMap<String, HashMap<String, String>>> map = new HashMap<String, HashMap<String, HashMap<String, String>>>();

    for (int i = 0; i < calendarData.size(); i++) {         

        if (!map.containsKey(calendarData.get(i).getYear())) {
            map.put(calendarData.get(i).getYear(), new HashMap<String, HashMap<String, String>>());
        }

        if (!map.get(calendarData.get(i).getYear()).containsKey(calendarData.get(i).getMonth())) {
            map.get(calendarData.get(i).getYear()).put(calendarData.get(i).getMonth(), new HashMap<String, String>());
        }

        map.get(calendarData.get(i).getYear()).get(calendarData.get(i).getMonth()).put(calendarData.get(i).getDay(), calendarData.get(i).getValue());
    }