2014-12-03 6 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" 
     } 
    } 
} 

Любая помощь очень ценится ,

EDIT

Я создал следовать вложенными Maps, но мне нужно правильную структуру, чтобы вернуть данные в указанном формате

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

Там он - он преобразуется! –

+0

Mayme, используя 3 привязанных карты, а затем отправляет их в библиотеку JSON, такую ​​как GSON или облако Джексона, делает трюк. –

+1

Это формат, который будет иметь проблемы {de,} сериализация, если честно. – fge

ответ

0

Это зависит немного от того, что вы на самом деле означает, для использования в качестве вашего ввода. Ваш «Список», который вы предоставили, действительно представляет собой таблицу текста. Если вы хотите, чтобы извлечь фактические цифры из каждой строки, вы можете использовать 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, структурированный так, как вы хотите.

Я ожидаю, что есть более элегантные способы сделать это (например, избегая данных как глобальной переменной), но это должно сработать.

+0

Спасибо, но я пытаюсь сделать это на Java, а не на JavaScript. – bgeveritt

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()); 
    } 
Смежные вопросы