2014-12-03 158 views
0

我开发了一个到我的Wordpress网站的钩子,我可以从其他应用程序更新信息。我正在使用需要特定JSON数据结构的特定插件。我的Java编程技能都有点生疏了,所以我希望有人能帮助我把下面的列表:将列表转换为JSON

+------+-------+-----+-------+ 
| 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()); 
+4

在那里,它是 - 它的转换! – 2014-12-03 01:16:48

+0

Mayme使用3个链接的地图,然后将它们发送到JSON库(如GSON或Jackson云)可以做到这一点。 – 2014-12-03 01:19:17

+1

这是一个格式,你会遇到问题{de,}序列化是诚实的。 – fge 2014-12-03 01:24:51

回答

0

这取决于你实际上意味着一点用作您的输入。您提供的“列表”实际上是一个文本列表。如果你想从各行提取的实际数字,您可以使用正则表达式JS这样的:

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

其中s是从你的文字输入线。如果它是包含实际数据线,row将有length === 4,你可以通过这些来像这样的功能,将其添加到您的数据:通过反复调用row(a[0], a[1], a[2], a[3])您表的每一行

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; 
} 

,你应该让你的对象data结构化你想要的方式。

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

+0

谢谢,但我正在尝试在Java中执行此操作,而不是JavaScript。 – bgeveritt 2014-12-03 02:07:30

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); 
    }  
} 

这是你想要的。

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()); 
    }