Year  Class    Student
------------------------
2013   No1     zhangsan
2013   No1     lisi
2013   No2     wangwu
2012   No1     zhaoliu
2012   No1     tianqi
转换前JSON格式:[{"Year":"2013","Class":"No1","Student":"zhangsan"}]转换后按以下格式显示JSON字符串{"info":[{"Year":"2013","ClassList":[{"Class":"No1","StudentList":[{"Student":"zhangsan"}]}]}]}
第一层循环代码如下 
第二层循环如何写?
 Map map1 = new HashMap();
Map map2 = new HashMap();
Map map3 = new HashMap();
Map map4 = new HashMap();
Map map5 = new HashMap();
map1.put("year", 2013);
map1.put("class", "No1");
map1.put("student", "zhangsan");
map2.put("year", 2013);
map2.put("class", "No1");
map2.put("student", "lisi");
map3.put("year", 2013);
map3.put("class", "No2");
map3.put("student", "wangwu");
map4.put("year", 2012);
map4.put("class", "No1");
map4.put("student", "zhaoliu");
map5.put("year", 2012);
map5.put("class", "No1");
map5.put("student", "tianqi");
List<Map> list = new ArrayList<Map>();
list.add(map1);
list.add(map2);
list.add(map3);
list.add(map4);
list.add(map5);
Map result = new HashMap();
List<Map> dbMapList = list;
List<Map> resultMapList = new ArrayList<Map>();
String s = new String();
for (Map dbMap : dbMapList) {
Map existMap = null;
for (Map resultMap : resultMapList) {
int newYear = (Integer) resultMap.get("year");
int oldYear = (Integer) dbMap.get("year");
if (newYear == oldYear) {
existMap = resultMap;
break;
} else {
continue;
}
}
Map classMap = new HashMap();
classMap.put("class", dbMap.get("class"));
if (existMap != null) {
List l = (List) existMap.get("ClassList");
l.add(classMap);
} else {
Map mapTmp = new HashMap();
mapTmp.put("year", dbMap.get("year"));
List<Map> classMapList = new ArrayList<Map>();
classMapList.add(classMap);
mapTmp.put("ClassList", classMapList);
resultMapList.add(mapTmp);
}
}
result.put("info", resultMapList);
JSONObject json = JSONObject.fromObject(result);
System.out.println(json.toString());  
    


解决方案 »

  1.   

    直接当做字符串处理??JSON数据解析没搞过
      

  2.   

    用JSON的话大概是这样:
    public static void main(String[] args) {
    JSONObject returnJson = new JSONObject();
    JSONArray yearJsonArray = new JSONArray();

    JSONArray jsonArray = JSONArray.fromObject(getInitString());
    List<String> yearList = getYearList(jsonArray);
    for (String year : yearList) {
    JSONObject yearJson = getYearJson(jsonArray, year);
    yearJsonArray.add(yearJson);
    }

    returnJson.put("info", yearJsonArray);
    System.out.println(returnJson.toString());
    }

    private static String getInitString() {
    String rawString = "[" +
    "{\"Year\":\"2013\",\"Class\":\"No1\",\"Student\":\"zhangsan\"}," +
    "{\"Year\":\"2013\",\"Class\":\"No1\",\"Student\":\"lisi\"}," +
    "{\"Year\":\"2013\",\"Class\":\"No2\",\"Student\":\"wangwu\"}," +
    "{\"Year\":\"2012\",\"Class\":\"No1\",\"Student\":\"zhaoliu\"}," +
    "{\"Year\":\"2012\",\"Class\":\"No1\",\"Student\":\"tianqi\"}" +
    "]";
    return rawString;
    }

    private static List<String> getYearList(JSONArray jsonArray) {
    List<String> yearList = new ArrayList<String>();
    for (Object object : jsonArray) {
    JSONObject json = (JSONObject) object;
    String year = json.getString("Year");
    if (!yearList.contains(year))
    yearList.add(year);
    }
    return yearList;
    }

    private static JSONObject getYearJson(JSONArray jsonArray, String year) {
    JSONObject yearJson = new JSONObject();
    JSONArray classListJsonArray = new JSONArray();

    List<String> classList = getClassList(jsonArray, year);
    for (String clazz : classList) {
    JSONObject classJson = getClassJson(jsonArray, year, clazz);
    classListJsonArray.add(classJson);
    }

    yearJson.put("Year", year);
    yearJson.put("ClassList", classListJsonArray);
    return yearJson;
    }

    private static List<String> getClassList(JSONArray jsonArray, String year) {
    List<String> classList = new ArrayList<String>();
    for (Object object : jsonArray) {
    JSONObject json = (JSONObject) object;
    if (year.equals(json.getString("Year"))) {
    String clazz = json.getString("Class");
    if (!classList.contains(clazz))
    classList.add(clazz);
    }
    }
    return classList;
    }

    private static JSONObject getClassJson(JSONArray jsonArray, String year, String clazz) {
    JSONObject classJson = new JSONObject();
    JSONArray studentListJsonArray = new JSONArray();

    List<String> studentList = getStudentList(jsonArray, year, clazz);
    for (String student : studentList) {
    JSONObject studentJson = new JSONObject();
    studentJson.put("Student", student);
    studentListJsonArray.add(studentJson);
    }

    classJson.put("Class", clazz);
    classJson.put("StudentList", studentListJsonArray);
    return classJson;
    }

    private static List<String> getStudentList(JSONArray jsonArray, String year, String clazz) {
    List<String> studentList = new ArrayList<String>();
    for (Object object : jsonArray) {
    JSONObject json = (JSONObject) object;
    if (year.equals(json.getString("Year")) && clazz.equals(json.getString("Class"))) {
    String student = json.getString("Student");
    if (!studentList.contains(student))
    studentList.add(student);
    }
    }
    return studentList;
    }
    供参考^_^
      

  3.   

    LS的思路蛮好的,不过这只能算是样例。建议首先抽象一个类,如StudentInfo,有属性三个:sYear , sClass ,sName
    然后给这个类提供一个objectToJson的方法(个人感觉和toString有点像),可以参考LS的写法,只是具体值换成对象的属性值。供参考^_^
      

  4.   

    用google的gson框架吧,跟据你的要求,设计出对应的bean就能直接使用toJson方法生成对应的json
      

  5.   

    LS的思路蛮好的,不过这只能算是样例。建议首先抽象一个类,如StudentInfo,有属性三个:sYear , sClass ,sName
    然后给这个类提供一个objectToJson的方法(个人感觉和toString有点像),可以参考LS的写法,只是具体值换成对象的属性值。供参考^_^没关系
    从数据库获取到的是一个List<Map>
    可以通过Map m = new HashMap();
    m.put("list", list);
    JSONArray jsonArray = JSONArray.fromObject(m.get("list"));获取字符串
      

  6.   

    首先表示感谢!Map map1 = new HashMap();
    Map map2 = new HashMap();
    Map map3 = new HashMap();
    Map map4 = new HashMap();
    Map map5 = new HashMap();
    map1.put("Year", 2013);
    map1.put("Class", "No1");
    map1.put("Student", "zhangsan");
    map2.put("Year", 2013);
    map2.put("Class", "No1");
    map2.put("Student", "lisi");
    map3.put("Year", 2013);
    map3.put("Class", "No2");
    map3.put("Student", "wangwu");
    map4.put("Year", 2012);
    map4.put("Class", "No1");
    map4.put("Student", "zhaoliu");
    map5.put("Year", 2012);
    map5.put("Class", "No1");
    map5.put("Student", "tianqi");
    List<Map> list = new ArrayList<Map>();
    list.add(map1);
    list.add(map2);
    list.add(map3);
    list.add(map4);
    list.add(map5);



    Map m = new HashMap();
    m.put("list", list);
    JSONArray jsonArray = JSONArray.fromObject(m.get("list"));

    JSONObject returnJson = new JSONObject();
    JSONArray yearJsonArray = new JSONArray();
    List<String> yearList = getYearList(jsonArray);
    for (String year : yearList) {
    JSONObject yearJson = getYearJson(jsonArray, year);
    yearJsonArray.add(yearJson);
    }
    returnJson.put("info", yearJsonArray);
    System.out.println(returnJson.toString());