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