2010-03-25 8 views
2

J'ai un ensemble de données dans une seule structure JSON:Convertir structure JSON

[[task1, 10, 99], 
[task2, 10, 99], 
[task3, 10, 99], 
[task1, 11, 99], 
[task2, 11, 99], 
[task3, 11, 99]] 

et ont besoin de le convertir à une autre structure JSON:

[{ 
    label: "task1", 
    data: [[10, 99], [11, 99]] 
}, 
{ 
    label: "task2", 
    data: [[10, 99], [11, 99]] 
}, 
{ 
    label: "task3", 
    data: [[10, 99], [11, 99]] 
}] 

Quelle est la meilleure façon de le faire avec javascript /Java?

Répondre

3

Pour Java, vous pouvez utiliser json-simple depuis JSON.org. Je ne pense pas qu'il y ait une façon «intelligente» de le faire, comme d'autres l'ont dit, il suffit de convertir le JSON en objets réels, de manipuler et de reconvertir. (voir ci-dessous) Aussi je crois que vous devez citer des chaînes littérales, par exemple. « Task1 », « label », « données » pour qu'il soit valide JSON (ou au moins, JSON simple, ne l'acceptera pas si vous ne le faites pas)

package com.another; 

import java.util.Arrays; 
import java.util.HashMap; 
import java.util.Map; 
import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 
import org.json.simple.parser.JSONParser; 
import org.json.simple.parser.ParseException; 

public class NewClass { 

    public static final String inputString = "[ [\"task1\", 10, 99], [\"task2\", 10, 99], [\"task3\", 10, 99], [\"task1\", 11, 99], [\"task2\", 11, 99], [\"task3\", 11, 99]]"; 

    public static void main(String[] args) throws ParseException { 
     JSONArray obj = (JSONArray) new JSONParser().parse(inputString); 
     Map<Object, JSONObject> output = new HashMap<Object, JSONObject>(); 
     for (Object o : obj) { 
      JSONArray item = (JSONArray) o; 
      Object title = item.get(0); 
      Object first = item.get(1); 
      Object second = item.get(2); 
      JSONObject dest = output.get(title); 
      if (dest == null) { 
       dest = new JSONObject(); 
       output.put(title, dest); 
       dest.put("label", title); 
       dest.put("data", new JSONArray()); 
      } 
      JSONArray data = new JSONArray(); 
      data.add(first); 
      data.add(second); 
      ((JSONArray) dest.get("data")).add(data); 
     } 
     String outputString = JSONArray.toJSONString(Arrays.asList(output.values().toArray())); 
     System.out.println(outputString); 
    } 
} 

Ici, il est à JS

var inputString = "[ [\"task1\", 10, 99], [\"task2\", 10, 99], [\"task3\", 10, 99], [\"task1\", 11, 99], [\"task2\", 11, 99], [\"task3\", 11, 99]]"; 

var obj = JSON.parse(inputString); 
var output = new Object(); 
for (var i in obj) { 
    var item = obj[i]; 
    var title = item[0]; 
    var first = item[1]; 
    var second = item[2]; 
    var dest = output[title]; 
    if (dest == null) { 
     dest = { 
      "label" : title, 
      "data": new Array() 
      }; 
     output[title] = dest; 
    } 
    dest.data.push([first, second]); 
} 
var outputArray = new Array(); 
for (var t in output) { 
    outputArray.push(output[t]); 
} 
+1

Je n'ai pas essayé l'extrait Java, mais le code Javascript est génial :) –

+0

Je ne suis pas vraiment un expert en Javascript alors je parie qu'il y a une façon plus élégante de le faire ... –

2

D'abord vous devez analyser le JSON pour obtenir de vrais objets. Avec JavaScript, vous pouvez simplement eval() ou utiliser JSON.parse(). Pour la version JSON.org, il existe une implémentation JSON pour les navigateurs qui ne l'ont pas.

Pour Java (une langue entièrement différente), JSON.org dispose également d'une implémentation d'un analyseur JSON que vous pouvez utiliser.

Une fois que vous avez les objets, vous pouvez simplement les réarranger jusqu'à ce que votre cœur soit content, puis JSON.stringify() (dans JS) pour les reconvertir en JSON.

0

Essayez Jolt. C'est une bibliothèque Java qui vous permet de spécifier une transformation dans json.