1. 程式人生 > >遞迴解析json物件(獲取某個key對應的value)

遞迴解析json物件(獲取某個key對應的value)

最近補充需求需要對json格式的資料進行處理,在網上搜尋了一些前輩們的心血,感覺不合適,就自己寫了一個,

廢話不說,直接上程式碼:

package mlstudy.json;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;


import com.alibaba.fastjson.JSONObject;

public class JSONUtil {
    
//    private static Object object = null;
    
    public static String readProperty(){
        Properties pro = new Properties();
        FileInputStream in;
        try {
            in = new FileInputStream("D:/workspace_git/mlstudy/target/test-classes/config/json.properties");
            pro.load(in);
            String jsonString = pro.getProperty("json");
            JSONObject json = JSONObject.parseObject(jsonString);
            
//            new Thread(
//                    new Runnable(){
//                        @Override
//                        public void run() {
//                            
//                            getKey(json,"express_company");
//                            System.out.println("settlement_id:"+object);
//                        }
//                        
//                    }
//                    
//                    )
//            .start();
//            
//            new Thread(
//                    new Runnable(){
//                        @Override
//                        public void run() {
//                            
//                            getKey(json,"express_company");
//                            System.out.println("express_company:"+object);
//                        }
//                        
//                    }
//                    
//                    )
//            .start();
//            
//            new Thread(
//                    new Runnable(){
//                        @Override
//                        public void run() {
//                            getKey(json,"express_company");
//                            System.out.println("receipt_money:"+object);
//                        }
//                        
//                    }
//                    
//                    )
//            .start();
            Map<Object,Object> result = new HashMap<>();
            getKey(json,"express_company",result);
            System.out.println("receipt_money:"+result);
            in.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    
    public static  Object getKey(JSONObject json,String filterKey,Map<Object,Object> result){
        Set<String> jsonSet = json.keySet();
        Iterator<String> keys = jsonSet.iterator();
        while (keys.hasNext()){
            String key=keys.next();
            Object obj = json.get(key);
            if (obj instanceof JSONObject){
                if (key.equals(filterKey)){
                    result.put("result", obj);
                }
                getKey((JSONObject)obj,filterKey,result);
            }else{
                if (key.equals(filterKey)){
                    result.put("result", obj);
                }
            }
        }
        return result;
    }
    public static void main(String[] args) {
        readProperty();
    }
}
 

json測試資料放在了檔案裡,因為拼寫太麻煩,就讀取了出來

因為遞迴直接返回資料是不行的,需要一層層返回,首先考慮用全域性靜態變數,功能可以實現,但是有執行緒安全問題!!!

所以,通過傳參將結果集封裝在map裡面,當然你也可以用其他物件型別接受你的返回值。貼出來歡迎大家指正