尝试从 Android Studio 中的 json 对象中检索 json 值

Posted

技术标签:

【中文标题】尝试从 Android Studio 中的 json 对象中检索 json 值【英文标题】:Trying to retrieve json value from json object in Android Studio 【发布时间】:2021-11-01 14:27:18 【问题描述】:

我无法使用 android Studio 检索“callingCodes”数组中的值。我的代码似乎正确,但我仍然有错误消息。

这是json文件:

[
  
    "isoName": "AF",
    "name": "Afghanistan",
    "currencyCode": "AFN",
    "currencyName": "Afghan Afghani",
    "currencySymbol": "؋",
    "flag": "https://s3.amazonaws.com/rld-flags/af.svg",
    "callingCodes": [
      "+93"
    ]
  ,
  
    "isoName": "AL",
    "name": "Albania",
    "currencyCode": "ALL",
    "currencyName": "Albanian Lek",
    "currencySymbol": "Lek",
    "flag": "https://s3.amazonaws.com/rld-flags/al.svg",
    "callingCodes": [
      "+355"
    ]
  ,
  
    "isoName": "DZ",
    "name": "Algeria",
    "currencyCode": "DZD",
    "currencyName": "Algerian Dinar",
    "currencySymbol": "د.ج.‏",
    "flag": "https://s3.amazonaws.com/rld-flags/dz.svg",
    "callingCodes": [
      "+213"
    ]
  
]

这是我的 java android studio 代码:

JSONArray jsonArray = new JSONArray(response);

                        for(int i = 0; i < jsonArray.length(); i++)
                            JSONObject data = jsonArray.getJSONObject(i);
                            String call = (String) data.getJSONArray("callingCodes").get(0);

                            countryOperatorList.add(new CountryOperator(
                                    data.getString("isoName"),
                                    data.getString("name"),
                                    data.getString("currencyCode"),
                                    data.getString("currencyName"),
                                    data.getString("currencySymbol"),
                                    data.getString("flag"),
                                    call

                            ));
                        

我尝试将键“callingCode”转换为字符串,但它返回为 ["+93"] 但我只想恢复 '+93'。

但是当我尝试上面的代码时,我收到了这个错误消息:

W/System.err: org.json.JSONException: Index 0 out of range [0..0)

这行代码抛出了什么:

String call = (String) data.getJSONArray("callingCodes").get(0);

有没有人有解决方案,以便我可以检索到调用代码键的值。

谢谢!

【问题讨论】:

【参考方案1】:

我在你的代码上改变了这个,我建议你使用它来获得价值 如果未找到密钥,则此使用的 optJSONArray 或 optString 返回 null 我的 sn-p 代码是

try 
  JSONArray array = new JSONArray(response);
  for(int i = 0; i < array.length(); i++)
    JSONObject data = array.getJSONObject(i);
    JSONArray jsr =  data.optJSONArray("callingCodes");
    String call=null;
    if (jsr!=null&&!jsr.isNull(0))
     // Log.e("value",jsr.optString(0));
      call = jsr.optString(0)
      
   
   countryOperatorList.add(new CountryOperator(
                                data.getString("isoName"),
                                data.getString("name"),
                                data.getString("currencyCode"),
                                data.getString("currencyName"),
                                data.getString("currencySymbol"),
                                data.getString("flag"),
                                call

                        ));
  

 catch (Exception e) 
  e.printStackTrace();

【讨论】:

非常感谢兄弟,它成功了,这正是我想要的【参考方案2】:

您自己进行解析有什么特别的原因吗?您不能将 Json 与对象一起使用吗?该示例使用Gson。

类似(示例代码在 Kotlin 中):

val data = Gson.fromJson(yourJsonString, List<YourJsonObject>)

data class YourJsonObject(
   val isoName: String,
   val name: String, 
   val name: String, 
   val currencyCode: String, 
   val currencyName: String, 
   val currencySymbol: String, 
   val flag: String, 
   val callingCodes: List<String>
)

Java 示例:

List<YourJsonObject> data = Gson.fromJson(yourJsonString, List<YourJsonObject>)

public class YourJsonObject 
   private String isoName;
   private String name;
   private String currencyCode;
   private String currencyName;
   private String currencySymbol;
   private String flag;
   private List<String> callingCodes;

【讨论】:

感谢您的回复,但我没有使用 Kotlin,我使用的是 JAVA。这个 json api 文件对于 app 来说非常重要。问题来自“callingCodes”,它是一个包含没有键的字符串数组的键。如果这个表包含一个键,我就不会有这个问题。 Java也可以,只是一个类,我用一个例子更新一下 @HorlyAndelo 我已经更新了,请看一下,在 callingCodes 节点内有一个字符串列表应该很好,然后一旦你有了你的对象,你就可以正常访问列表了object.callingCodes.get(0)【参考方案3】:

您的代码确实有效,但如果callingCodes 不为空。你必须确定callingCodes.length &gt; 0 调用array.get(0) 方法。

您可以使用array.optString(0),如果callingCode 不存在,它将返回一个空字符串。

【讨论】:

我试过了,但是没有用。非常感谢您的回答

以上是关于尝试从 Android Studio 中的 json 对象中检索 json 值的主要内容,如果未能解决你的问题,请参考以下文章

尝试从asp.net web api调用获取响应时android studio中的超时异常

如何将值从活动传递到 Android Studio 中的类?

从 Android Studio 中的片段将数据写入 Firebase

Visual Studio中的Android文档

Android Studio:将 URLS 从 URL 保存到数组

Android Studio Null 对象参考