【问题标题】:Parsing json in Android - org.json.JSONException typeMismatch在 Android 中解析 json - org.json.JSONException typeMismatch
【发布时间】:2016-06-06 17:20:14
【问题描述】:

我知道这个问题已经被问过很多次了,我已经查看了很多示例和问题以及对此的答案。然而,即使看看我认为应该是正确的,我仍然从 org.json.JSONException 的 logcat 中收到错误:org.json.JSON.typeMismatch(JSON.java:100) 的值。我对如何从 json 中提取信息或 json 中的某些内容导致它发生有些困惑。这两个我都很难找到。

从这里开始是完整的 json

{
"data": "{\"haz\":[{\"id\":220121,\"rwn\":\"US-90 EAST\",\"dir\":0,\"cs\":\"MCCART ST\",\"lat\":29.777589,\"lon\":-95.284037,\"acc\":\"Minor Accident/Collision\",\"vi\":3,\"la\":\"Alternate Lanes\",\"mlb\":2,\"flb\":2,\"rlb\":0,\"hlb\":0,\"slb\":1,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 4:34:41 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Right Shoulder, Right Lane, Center Lane\",\"toa\":0,\"toi\":0}],\"accident\":[{\"id\":220116,\"rwn\":\"IH-10 KATY\",\"dir\":0,\"cs\":\"WESTGREEN BLVD\",\"lat\":29.78518,\"lon\":-95.73529,\"acc\":\"Major Accident/Collision\",\"vi\":1,\"la\":\"Alternate Lanes\",\"mlb\":2,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 3:40:24 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Left Lane, Center Lane\",\"toa\":2,\"toi\":1},{\"id\":220130,\"rwn\":\"IH-45 GULF\",\"dir\":4,\"cs\":\"SCARSDALE BLVD\",\"lat\":29.599,\"lon\":-95.1976,\"acc\":\"Minor Accident/Collision\",\"vi\":2,\"la\":\"Alternate Lanes\",\"mlb\":1,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 6:11:32 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Center Lane\",\"toa\":1,\"toi\":1},{\"id\":220129,\"rwn\":\"IH-45 GULF\",\"dir\":4,\"cs\":\"SCARSDALE BLVD\",\"lat\":29.599,\"lon\":-95.1976,\"acc\":\"Minor Accident/Collision\",\"vi\":2,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 6:06:19 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Unknown\",\"toa\":1,\"toi\":1},{\"id\":220127,\"rwn\":\"IH-45 NORTH\",\"dir\":4,\"cs\":\"N MAIN ST\",\"lat\":29.79018,\"lon\":-95.37202,\"acc\":\"Minor Accident/Collision\",\"vi\":2,\"la\":\"Alternate Lanes\",\"mlb\":1,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 5:45:21 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Left Lane\",\"toa\":1,\"toi\":1},{\"id\":220131,\"rwn\":\"IH-610 SOUTH LOOP\",\"dir\":0,\"cs\":\"SH-225\",\"lat\":29.7096,\"lon\":-95.2674,\"acc\":\"Major Accident/Collision\",\"vi\":2,\"la\":\"Alternate Lanes\",\"mlb\":2,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 6:18:55 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Right Lane, Center Lane\",\"toa\":1,\"toi\":1},{\"id\":220126,\"rwn\":\"SOUTH SAM HOUSTON TOLLWAY\",\"dir\":0,\"cs\":\"FUQUA\",\"lat\":29.60503,\"lon\":-95.47413,\"acc\":\"Major Accident/Collision\",\"vi\":2,\"la\":\"Alternate Lanes\",\"mlb\":1,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":1,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 5:44:54 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Left Shoulder, Left Lane\",\"toa\":1,\"toi\":1}],\"highwater\":[{\"id\":220123,\"rwn\":\"IH-610 NORTH LOOP\",\"dir\":3,\"cs\":\"IH-45 NORTH\",\"lat\":29.8132,\"lon\":-95.3752,\"acc\":\"Minor Accident/Collision\",\"vi\":0,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":0,\"rlb\":1,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 4:53:25 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Exit Ramp\",\"toa\":0,\"toi\":2},{\"id\":220118,\"rwn\":\"US-290 NORTHWEST\",\"dir\":0,\"cs\":\"FM-529\",\"lat\":29.8795,\"lon\":-95.569,\"acc\":\"Minor Accident/Collision\",\"vi\":0,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":1,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 4:12:17 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"1 Frontage Road Lane\",\"toa\":0,\"toi\":2},{\"id\":220124,\"rwn\":\"US-90 ALTERNATE\",\"dir\":0,\"cs\":\"Lane Dr\",\"lat\":29.573644,\"lon\":-95.773905,\"acc\":\"Minor Accident/Collision\",\"vi\":0,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 5:03:40 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Unknown\",\"toa\":0,\"toi\":2},{\"id\":220125,\"rwn\":\"US-90 ALTERNATE\",\"dir\":0,\"cs\":\"Chimney Rock Rd\",\"lat\":29.640602,\"lon\":-95.482381,\"acc\":\"Minor Accident/Collision\",\"vi\":0,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 5:06:48 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Unknown\",\"toa\":0,\"toi\":2}],\"ice\":null,\"lostload\":[{\"id\":220122,\"rwn\":\"IH-10 EAST\",\"dir\":3,\"cs\":\"FREEPORT BLVD\",\"lat\":29.7707,\"lon\":-95.1778,\"acc\":\"Minor Accident/Collision\",\"vi\":0,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":2,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 4:34:54 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"2 Frontage Road Lanes\",\"toa\":0,\"toi\":4}],\"roaddebris\":[{\"id\":220117,\"rwn\":\"US-290 NORTHWEST\",\"dir\":3,\"cs\":\"FM-529\",\"lat\":29.8369039,\"lon\":-95.4991506,\"acc\":\"Minor Accident/Collision\",\"vi\":0,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":2,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 4:11:35 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"2 Frontage Road Lanes\",\"toa\":0,\"toi\":5}],\"stall\":[{\"id\":220128,\"rwn\":\"IH-45 NORTH\",\"dir\":4,\"cs\":\"N MAIN ST\",\"lat\":29.79018,\"lon\":-95.37202,\"acc\":\"Major Accident/Collision\",\"vi\":1,\"la\":\"Center Lane\",\"mlb\":1,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 6:03:41 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Left Lane, Center Lane\",\"toa\":0,\"toi\":6},{\"id\":220129,\"rwn\":\"IH-45 GULF\",\"dir\":4,\"cs\":\"SCARSDALE BLVD\",\"lat\":29.599,\"lon\":-95.3586,\"acc\":\"Minor Accident/Collision\",\"vi\":2,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":0,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 6:06:19 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"Unknown\",\"toa\":0,\"toi\":6}],\"fire\":[{\"id\":220119,\"rwn\":\"BELTWAY 8-NORTH\",\"dir\":0,\"cs\":\"LEE RD\",\"lat\":29.9396,\"lon\":-95.3034,\"acc\":\"Minor Accident/Collision\",\"vi\":0,\"la\":\"Alternate Lanes\",\"mlb\":0,\"flb\":2,\"rlb\":0,\"hlb\":0,\"slb\":0,\"omb\":0,\"osb\":0,\"dc\":\"5/28/2014 4:22:56 AM\",\"dm\":\"12/31/9999 11:59:59 PM\",\"sum\":\"2 Frontage Road Lanes\",\"toa\":0,\"toi\":7}]}",
"error": 0,
"when": "6/6/2016 12:33:59 PM"}

对于解析,我尝试这样做

JSONObject reader = new JSONObject(results);
JSONObject data = reader.getJSONObject("data");

我相信“数据”是阅读器的JSONObject,它本身就充满了无数的JSONArray。这是尝试读取我认为是名为“data”的 JSON 对象时引发错误的地方

错误(仅 sn-p 显示为吐出整个 json 字符串)

org.json.JSONException: Value {"haz":[{"id":220121,"rwn":"US-90 EAST","dir":0,"cs":"MCCART ST","
at org.json.JSON.typeMismatch(JSON.java:100)

有人看到我在这里做错了吗?

这是我从回调函数获取错误信息的完整代码

IncidentsList incidentsList = new IncidentsList();
JSONObject reader = new JSONObject(results);
        int error = reader.getInt("error");
        //there should always be a value for errors
        incidentsList.ERRORS = error == 1;

        //no errors, continue
        if(error == 0){
            Log.i("jsonreader", "no errors, read data object");
            JSONObject data = reader.getJSONObject("data");
            Log.i("jsonreader", "read data object");
        }

它永远不会超过 JSONObject data = reader.getJSONObject("data"); logcat 从不显示第二条 info 语句

谢谢

【问题讨论】:

  • 你贴的两行代码是正确的。请在您尝试解析的地方发布更多代码。
  • 刚刚注意到您的 json 无效。
  • 请告诉我更多。我完全控制了 json。
  • 我推荐这个网站以供将来检查:jsonlint.com
  • 请看我的回答。

标签: android json


【解决方案1】:

我相信“数据”是阅读器的 JSONObject

不,它实际上是一个字符串。注意大括号前的引号。

"data": "{

如果您可以控制 JSON,我建议您将其设为对象,以便更易于阅读和解析。

【讨论】:

  • 哇!。我什至没有看到这一点,它充分解释了为什么事情没有被捡起。我将不得不考虑重做 json 有点不同,所以它们是对象。非常感谢。
  • 您可以使用 getString 并从中创建一个新的 JSONObject,但修复数据源似乎是正确的方法
【解决方案2】:

您的 json 字符串无效。它应该像

一样结束
            "toi": 2
        }]
    },
    "errors": 0
}

但它的结局就像

            "toi": 2
        }], <------- this comma shouldn't be there
    },
    "errors": 0
}

更新

错误是"data": "{\"haz\":。应该是"data": {\"haz\":

应该像这样结束

        },
    "error": 0,
    "when": "6/6/2016 12:33:59 PM"
} 

【讨论】:

  • 感谢 Rohit5k2,但这是一个粘贴错误。我已经更新了完整的 json 验证。
【解决方案3】:

如@Rohit5k2 所说,带有额外逗号“,”的 JSON 格式, 我建议您使用 GSON 轻松解析您的 JSON, 而不是通过 jsonObject 和 jsonArray 解析每个元素。

您的 GSON 模型类可以是

import com.google.gson.Gson;
import java.util.List;

public class Resp {

    public DataEntity data;
    public int errors;

    public static Resp objectFromData(String str) {

        return new Gson().fromJson(str, Resp.class);
    }

    public static class DataEntity {
        public List<HazEntity> haz;
        public List<AccidentEntity> accident;
        public List<HighwaterEntity> highwater;

        public static DataEntity objectFromData(String str) {

            return new Gson().fromJson(str, DataEntity.class);
        }

        public static class HazEntity {
            public int id;
            public String rwn;
            public int dir;
            public String cs;
            public double lat;
            public double lon;
            public String acc;
            public int vi;
            public String la;
            public int mlb;
            public int flb;
            public int rlb;
            public int hlb;
            public int slb;
            public int omb;
            public int osb;
            public String dc;
            public String dm;
            public String sum;
            public int toa;
            public int toi;

            public static HazEntity objectFromData(String str) {

                return new Gson().fromJson(str, HazEntity.class);
            }
        }

        public static class AccidentEntity {
            public int id;
            public String rwn;
            public int dir;
            public String cs;
            public double lat;
            public double lon;
            public String acc;
            public int vi;
            public String la;
            public int mlb;
            public int flb;
            public int rlb;
            public int hlb;
            public int slb;
            public int omb;
            public int osb;
            public String dc;
            public String dm;
            public String sum;
            public int toa;
            public int toi;

            public static AccidentEntity objectFromData(String str) {

                return new Gson().fromJson(str, AccidentEntity.class);
            }
        }

        public static class HighwaterEntity {
            public int id;
            public String rwn;
            public int dir;
            public String cs;
            public double lat;
            public double lon;
            public String acc;
            public int vi;
            public String la;
            public int mlb;
            public int flb;
            public int rlb;
            public int hlb;
            public int slb;
            public int omb;
            public int osb;
            public String dc;
            public String dm;
            public String sum;
            public int toa;
            public int toi;

            public static HighwaterEntity objectFromData(String str) {

                return new Gson().fromJson(str, HighwaterEntity.class);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多