Android 如果格式不是常量,如何在JSON对象中搜索键?

Android 如果格式不是常量,如何在JSON对象中搜索键?,android,json,Android,Json,在我的android应用程序中,我将表单数据保存在json中,该json的父对象是一个json对象,可能包含简单的键值对、json数组或子json对象 父JSON对象的结构在运行时基本上是变化的,我必须添加一个函数,该函数可以查找针对任何键保存的值 例如,如果我有下面的JSON,我想得到key5的值。有没有办法得到这个值 我想尝试的一个解决方案是循环json,但我无法检查json对象索引上存储的内容,即它是简单字符串、json数组还是子json对象 { "key1": "value of

在我的android应用程序中,我将表单数据保存在json中,该json的父对象是一个json对象,可能包含简单的键值对、json数组或子json对象

父JSON对象的结构在运行时基本上是变化的,我必须添加一个函数,该函数可以查找针对任何键保存的值

例如,如果我有下面的JSON,我想得到
key5
的值。有没有办法得到这个值

我想尝试的一个解决方案是循环json,但我无法检查json对象索引上存储的内容,即它是简单字符串、json数组还是子json对象

{
    "key1": "value of key 1",
    "key2": "value of key 2",
    "key3": "value of key 3",
    "subjson": {
        "key4": "value of key 4",
        "key5": "value of key 5",
        "key6": "value of key 6"
    },
    "subjsonArray": [
        {
            "key7": "value of key 7",
            "key8": "value of key 8"
        },
        {
            "key9": "value of key 9",
            "key10": "value of key 10"
        }
    ]
}

有人能帮我解决这个问题吗。任何帮助都将不胜感激。

这里是一个处理json的示例

    JsonElement jsonElement = new Gson().fromJson("YOUR JSON", JsonElement.class);
    if(jsonElement.isJsonObject()){
        jsonElement.getAsJsonObject("key5");
    }else if(jsonElement.isJsonArray()){
        jsonElement.getAsJsonArray("key5");
    }
如果需要迭代json,可以使用

Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
    String key = entry.getKey();
    JsonElement value = jsonObject.get(entry.getKey()));
}
有关如何使用Gson的更多信息:

https://github.com/google/gson

下面是一个处理json的示例

    JsonElement jsonElement = new Gson().fromJson("YOUR JSON", JsonElement.class);
    if(jsonElement.isJsonObject()){
        jsonElement.getAsJsonObject("key5");
    }else if(jsonElement.isJsonArray()){
        jsonElement.getAsJsonArray("key5");
    }
如果需要迭代json,可以使用

Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
    String key = entry.getKey();
    JsonElement value = jsonObject.get(entry.getKey()));
}
有关如何使用Gson的更多信息:

https://github.com/google/gson

让我从这句话开始——在找到解决方案之前,您应该尝试解决非常量Json问题

但如果这超出了你的控制范围,以下是可能有效的方法

这将处理嵌套的
JsonObject
和/或
JsonArray

您只需复制/粘贴这些函数即可。 您所要做的就是调用这个函数-
getValueFromNonConstantJson(…)

private void getvaluefromnconstantjson(字符串fullJson,字符串键){
Gson Gson=新的Gson();
final-Type-mapType=new-TypeToken(){}.getType();
MapObjectMap=gson.fromJson(fullJson,mapType);
字符串值=”;
value=getValueFromMap(objectMap,键);
}
私有字符串getValueFromMap(映射对象映射,字符串键){
字符串结果=”;
//让我们快速检查根对象是否包含所需的键
//如果是这样,您根本不必启动for循环
if(objectMap.containsKey(“键5”)){
objectkey5value=objectMap.get(“key5”);
if(JsonObject的key5Value实例){
JsonObject JsonObject=(JsonObject)键5值;
结果=getValueFromJsonObject(jsonObject,键);
}else if(JsonArray的key5Value实例){
JsonArray JsonArray=(JsonArray)key5Value;
结果=getValueFromJsonArray(jsonArray,键);
}
}否则{
对于(Map.Entry:objectMap.entrySet()){
if(entry.getValue()instanceof JsonObject){
JsonObject JsonObject=(JsonObject)entry.getValue();
结果=getValueFromJsonObject(jsonObject,键);
如果(!result.isEmpty()){
//你找到了。
打破
}
}else if(JsonArray的entry.getValue()instanceof){
JsonArray JsonArray=(JsonArray)entry.getValue();
结果=getValueFromJsonArray(jsonArray,键);
如果(!result.isEmpty()){
//你找到了。
打破
}
}
}
}
返回结果;
}
私有字符串getValueFromJsonObject(JsonObject SubjectsOnObject,字符串键){
字符串值=”;
Gson Gson=新的Gson();
final-Type-mapType=new-TypeToken(){}.getType();
MapObjectMap=gson.fromJson(subjectOnObject,mapType);
value=getValueFromMap(objectMap,键);
返回值;
}
私有字符串getValueFromJsonArray(JsonArray,字符串键){
字符串值=”;
Gson Gson=新的Gson();
Object[]objectArr=gson.fromJson(subsonarray,Object[].class);
for(对象:objectArr){
if(映射的对象实例){
Map objectMap=(Map)对象;
value=getValueFromMap(objectMap,键);
如果(!value.isEmpty()){
打破
}
}
}
返回值;
}

首先让我说一句——在找到解决方案之前,您应该尝试解决非常量Json问题

但如果这超出了你的控制范围,以下是可能有效的方法

这将处理嵌套的
JsonObject
和/或
JsonArray

您只需复制/粘贴这些函数即可。 您所要做的就是调用这个函数-
getValueFromNonConstantJson(…)

private void getvaluefromnconstantjson(字符串fullJson,字符串键){
Gson Gson=新的Gson();
final-Type-mapType=new-TypeToken(){}.getType();
MapObjectMap=gson.fromJson(fullJson,mapType);
字符串值=”;
value=getValueFromMap(objectMap,键);
}
私有字符串getValueFromMap(映射对象映射,字符串键){
字符串结果=”;
//让我们快速检查根对象是否包含所需的键
//如果是这样,您根本不必启动for循环
if(objectMap.containsKey(“键5”)){
objectkey5value=objectMap.get(“key5”);
if(JsonObject的key5Value实例){
JsonObject JsonObject=(JsonObject)键5值;
结果=getValueFromJsonObject(jsonObject,键);
}else if(JsonArray的key5Value实例){
JsonArray JsonArray=(JsonArray)key5Value;
结果=getValueFromJsonArray(jsonArray,键);
}
}否则{
对于(Map.Entry:objectMap.entrySet()){
if(entry.getValue()instanceof JsonObject){
JsonObject JsonObject=(JsonObject)entry.getValue();
结果=getValueFromJsonObject(jsonObject,键);
如果(!result.isEmpty()){
//你找到了。
打破
}
}else if(JsonArray的entry.getValue()instanceof){
JsonArray JsonArray=(JsonArray)entry.getValue();
结果=getValueFromJsonArray(jsonArray,键);
如果(!result.isEmpty()){
//你找到了。
打破
private Object iterateArray(JSONArray jsonArray, String keySearch) throws JSONException {
        for (int i = 0; i < jsonArray.length(); i++) {
            Object jsonObject = jsonArray.get(i);
            if (jsonObject instanceof JSONObject) {
                Object inNested = interateNestedJson((JSONObject) jsonObject, keySearch);
                if (inNested != null) {
                    return inNested;
                }
            } else if (jsonObject instanceof JSONArray) {
                Object inArray = iterateArray((JSONArray) jsonObject, keySearch);
                if (inArray != null) {
                    return inArray;
                }
            }
        }
        return null;
    }
JSONObject json = new JSONObject(jsonString);
Object value = interateNestedJson(jsonObject, "key5");
public class JsonResponse extends JsonElement {

    //Key will be of type JsonElement
    @SerializedName("key1")
    public JsonElement key1;

    //Return type is JsonElement since it is decided at Runtime
    public JsonElement getKey1() {
        if (key1 instanceof JsonArray) {
            List<JsonObject> objectList = getArray(key1);
            return (JsonElement) objectList;            //If key is of type JsonArray then return JsonArray
        } else {
            return getObject(key1);                      //If key is of type JsonObject then return JsonObject
        }
    }

    public void setKey1(JsonElement key1) {
        this.key1 = key1;
    }

    private JsonObject getObject(JsonElement data) {
        Type type = new TypeToken<JsonObject>() {}.getType();
        return new Gson().fromJson(data, type);
    }


    private List<JsonObject> getArray(JsonElement data) {
        Type type = new TypeToken<List<JsonObject>>() {}.getType();
        return new Gson().fromJson(((JsonObject) data).get("key1"), type);
    }

    //Method from super class
    @Override
    public JsonElement deepCopy() {
        return null;
    }
}