【问题标题】:How to read this json data from server?如何从服务器读取这个 json 数据?
【发布时间】:2025-12-29 16:40:06
【问题描述】:

我在读取 json 数据和从服务器读取图像时遇到问题

  {
    "DS": {
        "LST": [
            {
                "OID": 1,
                "OCD": "1",
                "OPE": "AIRCEL",
                "IPH": "Images/provider/aircelsm.jpg",
                "MIL": 10,
                "MXL": 10
            },
            {
                "OID": 2,
                "OCD": "3",
                "OPE": "AIRTEL",
                "IPH": "Images/provider/airtelsm.jpg",
                "MIL": 10,
                "MXL": 10
            },
            {
                "OID": 4,
                "OCD": "4",
                "OPE": "BSNL",
                "IPH": "Images/provider/bsnlsm.jpg",
                "MIL": 10,
                "MXL": 10
            },
            {
                "OID": 6,
                "OCD": "5",
                "OPE": "DOCOMO",
                "IPH": "Images/provider/docomosm.jpg",
                "MIL": 10,
                "MXL": 10
            },
            {
                "OID": 7,
                "OCD": "6",
                "OPE": "IDEA",
                "IPH": "Images/provider/ideasm.jpg",
                "MIL": 10,
                "MXL": 10
            },
            {
                "OID": 8,
                "OCD": "7",
                "OPE": "MTS",
                "IPH": "Images/provider/mtssm.jpg",
                "MIL": 10,
                "MXL": 10
            },
            {
                "OID": 5,
                "OCD": "8",
                "OPE": "RELAINCE",
                "IPH": "Images/provider/reliancesm.jpg",
                "MIL": 10,
                "MXL": 10
            },
            {
                "OID": 3,
                "OCD": "9",
                "OPE": "VODAFONE",
                "IPH": "Images/provider/vodafonesm.jpg",
                "MIL": 10,
                "MXL": 10
            }
        ]
}
}

我已经尝试了代码,但它不起作用

    ArrayList<SpinnerMenu> selectedNetwork = new ArrayList<>();
        if(jsonStr != null){
            JSONObject json = null;
            SpinnerMenu spinnerData = new SpinnerMenu();
            try {
                JSONObject json = new JSONObject(jsonStr);
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            // Create the root JSONObject from the JSON string.
            JSONObject jsonRootObject = null;
            jsonRootObject = json.optJSONObject("DS");

            //Get the instance of JSONArray that contains JSONObjects
            JSONArray jsonArray = jsonRootObject.optJSONArray("LST");

            //Iterate the jsonArray and print the info of JSONObjects
            for(int i=0; i < jsonArray.length(); i++){
                JSONObject jsonObject = null;
                try {
                    jsonObject = jsonArray.getJSONObject(i);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                String iph = null;

                String oid = jsonObject.optString("OID").toString();
                String ocd = jsonObject.optString("OCD").toString();
                String opd = jsonObject.optString("OPE").toString();
                String mil = jsonObject.optString("MIL").toString();
                String mxl = jsonObject.optString("MXL").toString();


                try {
                    iph = jsonObject.getString("IPH").toString();
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }

                String urldisplay = "http://192/TotalRecharge/"+iph;
                Bitmap mIcon11 = null;
                try {
                    InputStream in = new java.net.URL(urldisplay).openStream();
                    mIcon11 = BitmapFactory.decodeStream(in);
                } catch (Exception e3) {
                    e3.printStackTrace();
                }

                spinnerData.setOid(oid);
                spinnerData.setOcd(ocd);
                spinnerData.setOpd(opd);
                spinnerData.setMil(mil);
                spinnerData.setMix(mxl);
                spinnerData.setImage(mIcon11);

                selectedNetwork.add(spinnerData);

            }

我的代码有什么问题。如何获取 json 数据并将其保存在 arraylist 中。在我的代码中,当我获取 json 数据并保存在 arraylist 中但它返回 null。我不知道如何解决这个问题.请帮帮我

【问题讨论】:

  • 你甚至没有尝试将它保存在数组列表中..
  • ArrayList selectedNetwork = new ArrayList();它是局部变量还是实例,如果它是实例,它应该可以工作。如果它是本地的,它将无法解决方法。
  • @ImAtWar 请看我的代码 selectedNetwork.add(spinnerData);选择的网络是数组列表
  • //获取包含JSONObjects的JSONArray实例 JSONArray jsonArray = jsonRootObject.optJSONArray("LST");使用 getJsonArray("LST");
  • //获取包含JSONObjects的JSONArray实例 JSONArray jsonArray = jsonRootObject.getJSONArray("LST");并检查数组的长度

标签: android json arraylist


【解决方案1】:

您正在声明名为 json 的变量两次。这甚至不应该编译。您想使用在 try 块之前声明的变量。

我还建议使用 Log.e 而不是 printStackTrace(在所有 catch 块中)。

JSONObject json = null;
try {
    json = new JSONObject(jsonStr);
} catch (JSONException e1) {
    Log.e("mytag", "Unable to parse json", e1");
}

spinnerData 对象还有另一个问题。您需要为每条记录创建新实例。您正在创建一个并且只是覆盖内部的值。移动这一行:

SpinnerMenu spinnerData = new SpinnerMenu();

进入循环:

//Iterate the jsonArray and print the info of JSONObjects
for(int i=0; i < jsonArray.length(); i++) {
    JSONObject jsonObject = null;
    SpinnerMenu spinnerData = new SpinnerMenu();

【讨论】:

  • Spinner 数据对象需要在数组循环内
  • @cricket_007 你说得对,这是我没看到的代码的另一个问题。
  • @cricket_007 你会发布你的答案吗
【解决方案2】:

嗨,伙计,我看到您正在努力使用 JSONObject 为每个值出价,您可以使用 Jackson 是 Java 的 JSON 库,这里有一个链接供您开始: http://tutorials.jenkov.com/java-json/jackson-objectmapper.html

总结一下你需要做什么: - 创建 POJO - 使用 JacksonMapper 绑定它们 例子 : 第一个 POJO 是

{
                "OID": 1,
                "OCD": "1",
                "OPE": "AIRCEL",
                "IPH": "Images/provider/aircelsm.jpg",
                "MIL": 10,
                "MXL": 10
            }

将会

public class FirstPojo{
@JsonProperty("OID")
Integer oid;
@JsonProperty("OCD")
String ocd;
@JsonProperty("OPE")
String ope;
@JsonProperty("IPH")
String iph;
@JsonProperty("MIL")
Integer mil;
@JsonProperty("MXL")
Integer mxl;
//Getters and Setters
}

第二个 POJO 将是 First POJO 的列表

    public class SecondPojo{
    @JsonProperty("LST")
    private List<FirstPojo> lstList;
//Getters and Setters
}

以此类推,第三个 POJO 将包含第二个 POJO 的对象,其属性名称为 DS 然后你可以打电话给你的杰克逊映射器并使用二等吸气剂获取你的列表 喜欢 : 假设您拥有或从网络请求中获取您的 JSON 作为字符串

String jsonString ="{\"DS\":...... ";


try {

    ThirdPojo thirdPojo = objectMapper.readValue(jsonString, ThirdPojo.class);
    List<FirstPojo> list=thirdPojo.getlst.getlstList();
} catch (IOException e) {
    e.printStackTrace();
}

慢慢来,发现杰克逊图书馆 :) 祝你好运

【讨论】: