4

这是我写的程序:

    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;

/**
 *
 * @author 311001
 */
public class NewClass {

    public static void main(String args[]) {
        JSONObject parentData = new JSONObject();
        JSONObject childData = new JSONObject();
        try {

            parentData.put("command", "login");
            parentData.put("uid", "123123123");
            childData.put("uid", "007");
            childData.put("username", "sup");
            childData.put("password", "bros");
            parentData.put("params", childData);
            System.out.println(parentData);

            Map<String, String> map = new HashMap<>();
            Iterator<?> iter = parentData.keys();
            while (iter.hasNext()) {
                String key = (String) iter.next();
                String value = parentData.getString(key);
                map.put(key, value);
            }

            for (Entry<String, String> entry : map.entrySet()) {
                System.out.println("key > " + entry.getKey() + "  : value = " + entry.getValue());
            }

            String testData = map.get("params.uid");
            System.out.println(testData);
            System.out.println("Tokenizing json");
            String resultStr = parentData.toString();
            System.out.println("String tokens ");
            StringTokenizer st = new StringTokenizer(resultStr);
            System.out.println(st.countTokens());
            while (st.hasMoreTokens()) {
                System.out.println(st.nextToken());
            }
            String testDat="abc :: result";
            StringTokenizer simpleString = new StringTokenizer(testDat);
            System.out.println("Tokenizing simple string");
            System.out.println(simpleString.countTokens());
            while (simpleString.hasMoreTokens()) {
                System.out.println(simpleString.nextToken());
            }


        } catch (JSONException e) {
            e.printStackTrace();
        }


    }
}

我得到的输出:

run:
{"command":"login","uid":"123123123","params":{"uid":"007","username":"sup","password":"bros"}}
key > uid  : value = 123123123
key > command  : value = login
key > params  : value = {"uid":"007","username":"sup","password":"bros"}
null
Tokenizing json
String tokens 
1
{"command":"login","uid":"123123123","params":{"uid":"007","username":"sup","password":"bros"}}
Tokenizing simple string
3
abc
::
result
BUILD SUCCESSFUL (total time: 0 seconds)

如何接收我的 json 对象中的所有键。如果我标记化为什么我只得到一个字符串标记,而对于一个简单的字符串却得到正确的输出 3 个标记。

4

4 回答 4

5

您可以递归地遍历您的 JsonObject 以获取所有密钥。这是伪代码

findKeys(JsonObject obj,List keys){
List<String>keysFromObj=obj.keys();
keys.addAll(keysFromObj);
for(String key:keysFromObj){
    if(obj.get(key).getClass()==JSONObject.class){
         findKeys(obj.get(key),keys);
         }
    }
}

所以假设如果你的对象是 {"a":1,"b":{"c":"hello","d":4.0}} 上面的函数应该给你 ["a","b","c ","d"]

但是如果你只想 ["a","c","d"] 作为你的输出,你可以写 -

findKeys(JsonObject obj,List keys){
List<String>keysFromObj=obj.keys();

for(String key:keysFromObj){
    if(obj.get(key).getClass()==JSONObject.class){
         findKeys(obj.get(key),keys);
         }else{
         keys.add(key);
         }
    }
}
于 2013-01-31T07:07:40.357 回答
2

这是使用org.json 而不是 org.json.simple的一种实现

它使用 java.util.key:value 组合查找 json 的所有唯一值。

输入json:

{
    d: {
        results: [{
            __metadata: {
                uri:https://google.com, 
                    type: User
            },
            userId: jmarthens1,
            businessPhone: null,
            salaryProrating: null,
            empId: 2023,
            lastModifiedDateTime: Date(1458308558000 + 0000),
            finalJobRole: null,
            username: jmarthens,
            married: false,
            futureLeader: null,
            salary: 79000.0,
            jobRole: Program Manager,
            Professional Services,
            nickname: null,
            salaryLocal: null
        }]
    }
}

结果:

empId-2023
lastModifiedDateTime-Date(1458308558000+0000)
salary-79000.0
userId-jmarthens1
jobRole-Program Manager, Professional Services
type-User
uri-https://google.com
username-jmarthens

代码:

package test;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class TestClass {
    private static StringBuilder strOut = new StringBuilder();

    public static void main(String[] args) {

        try {
            String json = "{\"d\" : {\"results\" : [{\"__metadata\" : {\"uri\" : \"https://apisalesdemo8.successfactors.com:443/odata/v2/User('jmarthens1')\","
                    + " \"type\" : \"SFOData.User\"}, \"userId\" : \"jmarthens1\", \"businessPhone\" : null, \"salaryProrating\" : null, \"empId\" : \"2023\", "
                    + "\"lastModifiedDateTime\" : \"Date(1458308558000+0000)\", \"finalJobRole\" : null, \"username\" : \"jmarthens\", \"married\" : false, "
                    + "\"futureLeader\" : null, \"salary\" : \"79000.0\", \"jobRole\" : \"Program Manager, Professional Services\", \"nickname\" : null, \"salaryLocal\" : null}]}}";
            JSONObject inputJson = new JSONObject(json);
            List<String> lst = new ArrayList<String>();
            lst = findKeysOfJsonObject(inputJson, lst);

            try (BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\temp\\temp.txt"))) {
                writer.write(strOut.toString());
            }
        } catch (JSONException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static List<String> findKeysOfJsonArray(JSONArray jsonIn, List<String> keys) {
        List<String> keysFromArr = new ArrayList<>();

        if (jsonIn != null && jsonIn.length() != 0) {
            for (int i = 0; i < jsonIn.length(); i++) {
                JSONObject jsonObjIn = jsonIn.getJSONObject(i);
                keysFromArr = findKeysOfJsonObject(jsonObjIn, keys);
            }
        }

        return keysFromArr;
    }

    private static List<String> findKeysOfJsonObject(JSONObject jsonIn, List<String> keys) {

        Iterator<String> itr = jsonIn.keys();
        List<String> keysFromObj = makeList(itr);
        keys.addAll(keysFromObj);

        itr = jsonIn.keys();
        while (itr.hasNext()) {
            String itrStr = itr.next();
            // System.out.println("out " + itrStr);
            JSONObject jsout = null;
            JSONArray jsArr = null;
            if (jsonIn.get(itrStr).getClass() == JSONObject.class) {
                jsout = jsonIn.getJSONObject(itrStr);
                findKeysOfJsonObject(jsout, keys);
            } else if (jsonIn.get(itrStr).getClass() == JSONArray.class) {
                jsArr = jsonIn.getJSONArray(itrStr);
                keys.addAll(findKeysOfJsonArray(jsArr, keys));
            } else if (jsonIn.get(itrStr).getClass() == String.class) {
                System.out.println(itrStr + "-" + jsonIn.get(itrStr));
                strOut.append(itrStr + "," + jsonIn.get(itrStr));
                strOut.append(System.lineSeparator());
            }
        }
        return keys;
    }

    public static List<String> makeList(Iterator<String> iter) {
        List<String> list = new ArrayList<String>();
        while (iter.hasNext()) {
            list.add(iter.next());
        }
        return list;
    }
}
于 2016-07-12T15:39:03.637 回答
1

我迟到了,但我在这里添加了我的解决方案:

输入:

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

检索所有唯一键:

public static void findAllKeys(Object object, Set<String> finalKeys) {
        if (object instanceof JSONObject) {
            JSONObject jsonObject = (JSONObject) object;

            jsonObject.keySet().forEach(childKey -> {
                finalKeys.add(childKey);
                findAllKeys(jsonObject.get(childKey), finalKeys);
            });
        } else if (object instanceof JSONArray) {
            JSONArray jsonArray = (JSONArray) object;

            IntStream.range(0, jsonArray.length())
                    .mapToObj(jsonArray::get)
                    .forEach(o -> findAllKeys(o, finalKeys));
        }
    }

用法:

Set<String> finalKeys = new HashSet<>();
findAllKeys(new JSONObject(str), finalKeys);
System.out.println(finalKeys);

输出:

[
  GlossEntry,
  GlossSee,
  SortAs,
  GlossList,
  title,
  GlossDiv,
  glossary,
  GlossTerm,
  GlossDef,
  para,
  GlossSeeAlso,
  ID,
  Acronym,
  Abbrev
]

检索所有唯一的“完整路径”键:

public void findAllKeys(Object object, String key, Set<String> finalKeys) {
    if (object instanceof JSONObject) {
        JSONObject jsonObject = (JSONObject) object;

        jsonObject.keySet().forEach(childKey -> {
            findAllKeys(jsonObject.get(childKey), key != null ? key + "." + childKey : childKey, finalKeys);
        });
    } else if (object instanceof JSONArray) {
        JSONArray jsonArray = (JSONArray) object;
        finalKeys.add(key);

        IntStream.range(0, jsonArray.length())
                .mapToObj(jsonArray::get)
                .forEach(jsonObject -> findAllKeys(jsonObject, key, finalKeys));
    }
    else{
        finalKeys.add(key);
    }
}

用法:

Set<String> finalKeys = new HashSet<>();
findAllKeys(new JSONObject(jsonStr), null, finalKeys);
System.out.println(finalKeys);

输出:

[
  glossary.GlossDiv.GlossList.GlossEntry.ID,
  glossary.title,
  glossary.GlossDiv.GlossList.GlossEntry.GlossSee,
  glossary.GlossDiv.GlossList.GlossEntry.GlossTerm, 
  glossary.GlossDiv.GlossList.GlossEntry.Acronym, 
  glossary.GlossDiv.GlossList.GlossEntry.Abbrev, 
  glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para, 
  glossary.GlossDiv.GlossList.GlossEntry.SortAs, 
  glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso,
  glossary.GlossDiv.title
]
于 2021-05-17T16:25:31.807 回答
0
static Set<String> finalListOfKeys = new LinkedHashSet<String>();


public static void main(String[] args) {
    JSONParser parser = new JSONParser();

    try {

        Object obj = parser.parse(new FileReader("Absolute path of json file"));
        JSONObject jsonObject = (JSONObject) obj;
        Set<String> jsonKeys = jsonObject.keySet();
        for (String key : jsonKeys) {
            Object val = jsonObject.get(key);
            if (val instanceof JSONArray) {
                JSONArray array = (JSONArray) val;
                jsonArray(array, key);

            } else if (val instanceof JSONObject) {
                JSONObject jsonOb = (JSONObject) val;
                jsonObj(jsonOb, key);
            } else {
                finalListOfKeys.add(key);
                System.out.println("Key is : " + key);
            }
        }

        System.out.println("Final List : " + finalListOfKeys);

    } catch (Exception e) {
        e.printStackTrace();
    }
}


public static void jsonObj(JSONObject object, String key2) {
    Set<String> innerKeys = object.keySet();
    System.out.println("Inner Keys : " + innerKeys);
    for (String key : innerKeys) {
        System.out.println("Key : " + key);
        Object val = object.get(key);
        if (val instanceof JSONArray) {
            JSONArray array = (JSONArray) val;
            jsonArray(array, key2 + "->" + key);

        } else if (val instanceof JSONObject) {
            JSONObject jsonOb = (JSONObject) val;
            jsonObj(jsonOb, key2 + "->" + key);
        } else {
            finalListOfKeys.add(key2 + "->" + key);
            System.out.println("Key is : " + key2 + "->" + key);
        }
    }
}

public static void jsonArray(JSONArray array, String key) {
    if (array.size() == 0) {
        finalListOfKeys.add(key);
    } else {

        for (int i = 0; i < array.size(); i++) {
            Object jObject = array.get(i);
            if (jObject instanceof JSONObject) {
                JSONObject job = (JSONObject) jObject;
                System.out.println(job);
                jsonObj(job, key);

            }
        }
    }
}
于 2017-02-03T10:43:58.140 回答