JAVA,当某个json数据中一个字段与另一个json数据中的字段值相同时,对两个json进行合并且相加,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA,当某个json数据中一个字段与另一个json数据中的字段值相同时,对两个json进行合并且相加,相关的知识,希望对你有一定的参考价值。

原JSON串:["depid":"5","score":"10","depid":"4","score":"40","depid":"4","score":"30","depid":"5","score":"30"]
结果::["depid":"5","score":"40","depid":"4","score":"70"],
具体的java代码做参考。谢谢!

要判断json数据的字段与其他数据是否相同,那么肯定是要先解析json数据。解析json数据的方式很多,Gson、FastJson都是很简便实用的工具。这里以Gson为例。

import java.lang.reflect.Type;
import java.util.*;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Divination 
    public static void main(String[] args) 
        String jsonStr = "[\\"depid\\":\\"5\\",\\"score\\":\\"10\\",\\"depid\\":\\"4\\",\\"score\\":\\"40\\",\\"depid\\":\\"4\\",\\"score\\":\\"30\\",\\"depid\\":\\"5\\",\\"score\\":\\"30\\"]";
        System.out.println("原始的json字符串:" + jsonStr);

        // 解析
        Gson gson = new Gson();
        Type type = new TypeToken<ArrayList<JsonData>>() 
        .getType();
        ArrayList<JsonData> list = gson.fromJson(jsonStr, type);

        // 合并
        List<JsonData> ordered = new ArrayList<>();
        Map<Integer, JsonData> map = new HashMap<>();
        for (JsonData jsonData : list) 
            JsonData data = map.get(jsonData.getDepid());
            if (data != null)  // depid相同的合并score字段
                data.setScore(data.getScore() + jsonData.getScore());
             else 
                map.put(jsonData.getDepid(), jsonData);
                ordered.add(jsonData);
            
        

        // 还原为json字符串
        System.out.println("合并后json字符串:" + gson.toJson(map.values()));
        System.out.println("合并后json字符串(按原来的顺序):" + gson.toJson(ordered));
    


class JsonData 
    private int depid;
    private int score;

    public int getDepid() 
        return depid;
    

    public void setDepid(int depid) 
        this.depid = depid;
    

    public int getScore() 
        return score;
    

    public void setScore(int score) 
        this.score = score;
    

以上代码中List<JsonData> ordered = new ArrayList<>();是为了按原json数组的顺序输出合并后的结果,如果对顺序无要求可以删除相关代码。

运行结果:

参考技术A 将json转化为list 然后遍历list中的map 得到新的list 在转成json 参考技术B String str = "[\\"score\\": \\"10\\",\\"depid\\": \\"5\\",\\"score\\": \\"40\\",\\"depid\\": \\"4\\",\\"score\\": \\"30\\",\\"depid\\": \\"4\\",\\"score\\": \\"30\\",\\"depid\\": \\"5\\"]";
JSONArray array = (JSONArray) JSONSerializer.toJSON(str);
HashMap<String,String> map = new HashMap<String,String>();
for(int i = 0; i < array.length; i++)
    JSONObject obj = array[i];
    String depid = obj.getString("depid");
    String score = obj.getString("score");
    String s1 = map.get(depid);
    if(null == s1)
        map.put(depid, score);
    else
        int s = Interger.parseInt(s1);
        map.put(depid, score + s);
    


foreach map for convert to JSON again

参考技术C 这只能通过遍历原来的数组,然后再处理啊。 参考技术D public static void main(String[] args)
    
        String string = "[\\"depid\\":\\"5\\",\\"score\\":\\"10\\",\\"depid\\":\\"4\\",\\"score\\":\\"40\\",\\"depid\\":\\"4\\",\\"score\\":\\"30\\",\\"depid\\":\\"5\\",\\"score\\":\\"30\\"]";
        JSONArray fromObject = JSONArray.fromObject(string);
        Map<String,Integer> map = new HashMap<String, Integer>();
       
        for (Object object : fromObject)
        
            JSONObject jsonObject = (JSONObject) object;
            String depid = (String)jsonObject.get("depid");
            Integer score = Integer.valueOf((String)jsonObject.get("score"));
            if (map.containsKey(depid))
            
                int integer = map.get(depid);
                map.put(depid, integer+score);
            
            else
            
                map.put(depid, score);
            
        
        Set<Entry<String, Integer>> entrySet = map.entrySet();
        JSONArray jsonArray = new JSONArray();
        
        for (Entry<String, Integer> entry : entrySet)
        
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("depid",entry.getKey());
            jsonObject.put("score",String.valueOf(entry.getValue()));
            jsonArray.add(jsonObject);
        
        System.out.println(jsonArray.toString());
    

本回答被提问者采纳

以上是关于JAVA,当某个json数据中一个字段与另一个json数据中的字段值相同时,对两个json进行合并且相加,的主要内容,如果未能解决你的问题,请参考以下文章

我有一个json数组怎么获取某个字段的对应的对象

JS调用数据库字段并验证 当数据库字段为某个值的时候 该页面就自动跳转到另一个指定的页面! 高手给代码

SQL语句 一个表的值与另一个表的字段一致,怎么把两一个表的值作为条件,限定查询的字段

查询数据库中指定字段中存储的json数据是不是包含某个值

angularJS怎么修改一个json文件中的数据

判断json是不是含有某个字段的方法