繁体   English   中英

使用Java中的键对Json响应进行分组-Android Studio

[英]Grouping Json response with keys in java - android studio

我是java和android开发的新手。 我正在学习json解析。 我得到了这样的json响应。

{"code":"0","data":    
[ {"chrDesigName":"Developer","chrempName":"Test Employee1"},
  {"chrDesigName":"Developer","chrempName":"Test Employee2"}, 
  {"chrDesigName":"Tester","chrempName":"Test Employee3"},
  {"chrDesigName":"Analyst","chrempName":"Test Employee4"},
  {"chrDesigName":"Developer","chrempName":"Test Employee5"},
  {"chrDesigName":"Tester","chrempName":"Test Employee6"}]

我想将这个Json解析成这样的东西。

{"Developer" : [{"chrempName" : "Test Employee1"},
                    {"chrempName" : "Test Employee2"},
                    {"chrempName" : "Test Employee5"}],
"Tester" : [{"chrempName" : "Test Employee3"},
                    {"chrempName" : "Test Employee6"}],
"Analyst" : [{"chrempName" : "Test Employee4"}]}  

我该如何实现? 我的动机是根据所有雇员的名称对其进行分组。

作为一个快速的技巧,我使用了2个不同的库来做到这一点。 您也可以使用Jackson来“统一”。

import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.codehaus.jackson.map.ObjectMapper;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

public class JsonReformatter {

    public static void main(String[] args) throws Exception {
        String jsonString = "{\"code\": \"0\",\"data\": [{\"chrDesigName\": \"Developer\",\"chrempName\": \"Test Employee1\"},{\"chrDesigName\": \"Developer\",\"chrempName\": \"Test Employee2\"},{\"chrDesigName\": \"Tester\",\"chrempName\": \"Test Employee3\"},{\"chrDesigName\": \"Analyst\",\"chrempName\": \"Test Employee4\"},{\"chrDesigName\": \"Developer\",\"chrempName\": \"Test Employee5\"},{\"chrDesigName\": \"Tester\",\"chrempName\": \"Test Employee6\"}]}";

        ObjectMapper mapper = new ObjectMapper();

        // Map<String, Object> dataMap = mapper.readValue(jsonString,
        // new TypeReference<Map<String, Object>>() {
        // });
        //
        // System.out.println(dataMap.get("data") +
        // ((ArrayList)dataMap.get("data")).get(0).getClass().getName()) ;

        JsonArray dataArray = new JsonParser().parse(jsonString).getAsJsonObject().getAsJsonArray("data");

        HashMap<String, List<String>> designationsMap = new HashMap<String, List<String>>();

        for (JsonElement element : dataArray) {
            String designation = element.getAsJsonObject().get("chrDesigName").getAsString();
            String empName = element.getAsJsonObject().get("chrempName").getAsString();
            if (designationsMap.containsKey(designation)) {
                designationsMap.get(designation).add(empName);
            } else {
                ArrayList<String> emptyList = new ArrayList<String>();
                emptyList.add(empName);
                designationsMap.put(designation, emptyList);
            }
        }

        StringWriter result = new StringWriter();
        mapper.writeValue(result, designationsMap);
        System.out.println(result);

    }

}

此打印

{"Analyst":["Test Employee4"],"Tester":["Test Employee3","Test Employee6"],"Developer":["Test Employee1","Test Employee2","Test Employee5"]}

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.1</version>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.7</version>
</dependency>

这是代码:

JsonParser parser =  new JsonParser();

JsonElement jsonElement = parser.parse(json);
JsonObject jsonObj = jsonElement.getAsJsonObject();

JsonArray data = new JsonArray();
data = jsonObj.getAsJsonArray("data");

JsonArray developer = new JsonArray();
JsonArray tester = new JsonArray();
JsonArray analyst = new JsonArray();

for (int i=0; i < data.size; i++){
JsonObject itemArr = (JsonObject)data.get(i);
JsonObject temp = new JsonObject();

if(itemArr.get("chrDesigName").getAsString().equals("Developer")){
   temp.addProperty("chrempName",itemArr.get("chrempName").getAsString());
   developer.add(temp);
}else if(itemArr.get("chrDesigName").getAsString().equals("Tester")){
   temp.addProperty("chrempName",itemArr.get("chrempName").getAsString());
   tester.add(temp);
}else if(itemArr.get("chrDesigName").getAsString().equals("Analyst")){
   temp.addProperty("chrempName",itemArr.get("chrempName").getAsString());
   analyst.add(temp);
}
}

JsonObject resultObject = new JsonObject();
resultObject.add("Developer",developer);
resultObject.add("Tester",tester);
resultObject.add("Analyst",analyst);

这样,您可以根据需要创建一个新的resultObject对象。 这是静态方式。 您可以将其进一步发展为动态方式。 您将需要添加com.google.gson库来编译此代码。

您可以通过以下方法简单地实现此目的:首先将所有“ chrDesigName”值存储在数组中,然后循环遍历该数组的每个元素以创建所需的JSON对象。

e.g. //using JSON.simple module for decode/encode into JSON object.
JSONObject obj1 = {"code":"0","data":    
[ {"chrDesigName":"Developer","chrempName":"Test Employee1"},
  {"chrDesigName":"Developer","chrempName":"Test Employee2"}, 
  {"chrDesigName":"Tester","chrempName":"Test Employee3"},
  {"chrDesigName":"Analyst","chrempName":"Test Employee4"},
  {"chrDesigName":"Developer","chrempName":"Test Employee5"},
  {"chrDesigName":"Tester","chrempName":"Test Employee6"}]};

//Now, store all 'chrDesigName' in a local arrray.
List<String> arr = new ArrayList<String>();
for(JSONObject json : obj1.get("data")){
   //avoid to add duplicate entry. e.g. there are multiple Developer so avoid adding more than 1 times.
   boolean isDuplicate = false; 
   for(int i=0; i<arr.size();i++){        
       if(arr[i]==json.get("chrDesigName")){
           isDuplicate = true;
       }
    }
    if(isDuplicate==false){
        arr.add(json.get("chrDesigName"));
    }
}

//Now finally create your desired parsed JSON object.
JSONObject result= new JSONObject(); //final Result JSON object.
for(String chrDesigName : arr){
    //first adding empty list.
    result.put(chrDesigName, new ArrayList<JSONObject>());

    //now, checking on each data obj1 if it has chrDesigName and if yes then getting its chrEmpName and adding in list.
    for(JSONObject json : obj1.get("data")){
        if(chrDesigName==json.get("chrDesigName"){
            JSONObject sub_json = new JSONObject();
            sub_json.put("chrempName",json.get("chrempName");
            result.get(chrDesigName).add(sub_json);
        }
    }    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM