解析本地 Json 文件时的 JsonExeption

Posted

技术标签:

【中文标题】解析本地 Json 文件时的 JsonExeption【英文标题】:JsonExeption when parsing local Json file 【发布时间】:2019-04-23 04:01:47 【问题描述】:

我正在尝试使用本地 Json 文件在 google maps api 上显示标记。问题是我得到了这个错误。

W/System.err: org.json.JSONException: 值 "predictions":["description":"GAME Paisley, High Street, Paisley, UK","id":"d4fafbac99296d0a545170bb9af984e6251ac917","matched_substrings":["length":4,"offset":0],"place_id":"ChIJN0z6gTdJiEgREKQBicnWcAs","re​​ference":"ChIJN0z6gTdJiEgREKQBicnWcAs"" :"main_text":"游戏 佩斯利","main_text_matched_substrings":["length":4,"offset":0],"secondary_text":"High 英国佩斯利街","terms":["offset":0,"value":"GAME 佩斯利","offset":14,"value":"高 街道","offset":27,"value":"佩斯利","offset":36,"value":"UK"],"types":["establishment"],"描述":"游戏 格拉斯哥联合街, 联合街, 格拉斯哥, UK","id":"9579c1d2df7575a2eb479ccd987cf29ab0ab9c6e","matched_substrings":["length":4,"offset":0],"place_id":"ChIJ2YlAjJ5GiEgRu7aBLOFlkkc","re​​ference":"ChIJ2YlAjJ5GiEgRu7aBLOFlkkc","structured_formatting :"main_text":"游戏 格拉斯哥联盟 Street","main_text_matched_substrings":["length":4,"offset":0],"secondary_text":"Union Street, Glasgow, UK","terms":["offset":0," value":"GAME 格拉斯哥联盟 Street","offset":27,"value":"Union 街道","offset":41,"value":"Glasgow","offset":50,"value":"UK"],"types":["establishment"],"描述":"游戏, 圣以诺广场,格拉斯哥, UK","id":"582edc64f3d6654d8ff9a8da364c37a8e0544102","matched_substrings":["length":4,"offset":0],"place_id":"ChIJq2yljp5GiEgRpsnAfUFKGEA","re​​ference":"ChIJq2yljp5GiEgRpsnAfUFKGEA"," :"main_text":"Game","main_text_matched_substrings":["length":4,"offset":0],"secondary_text":"圣以诺广场,格拉斯哥, UK","terms":["offset":0,"value":"Game","offset":6,"value":"Saint 以诺 Square","offset":26,"value":"Glasgow","offset":35,"value":"UK"],"types":["establishment"],"描述":"游戏 格拉斯哥 King's Inch Road, King's Inch Road, 格拉斯哥, UK","id":"b60dbbc529f25226dfee4c05c80de8e92137588d","matched_substrings":["length":4,"offset":0],"place_id":"ChIJv2Te_ENPiEgRknxQydZhR8Q","re​​ference":"ChIJv2Te_ENPiEgRknxQydZhR8Q :"main_text":"游戏 格拉斯哥国王英寸 Road","main_text_matched_substrings":["length":4,"offset":0],"secondary_text":"King's Inch Road, Glasgow, UK","terms":["offset":0,"value":"GAME Glasgow 王寸路","offset":31,"value":"王寸 Road","offset":49,"value":"Glasgow","offset":58,"value":"UK"],"types":["establishment"],"描述":"游戏, 考格伦路,格拉斯哥, UK","id":"86a4ed10b3b9b609f68533f1c47dc8f9ae5d2aee","matched_substrings":["length":4,"offset":0],"place_id":"ChIJT3vEiYRIiEgR4EIqP8jmL6o","re​​ference":"ChIJT3vEiYRIiEgR4EIqP8jmLo6 :"main_text":"GAME","main_text_matched_substrings":["length":4,"offset":0],"secondary_text":"Cowglen 路,格拉斯哥, UK","terms":["offset":0,"value":"GAME","offset":6,"value":"Cowglen Road","offset":20,"value":"Glasgow","offset":29,"value":"UK"],"types":["establishment"]],"状态":"确定" org.json.JSONObject 类型的无法转换为 JSONArray W/System.err:在 org.json.JSON.typeMismatch(JSON.java:111) 在 org.json.JSONArray.(JSONArray.java:96) 在 org.json.JSONArray.(JSONArray.java:108) 在附近的places.pnai.uws.com.maplocation.MapsActivity$AsyncTaskGetMareker.doInBackground(MapsActivity.java:112) 在 附近places.pnai.uws.com.maplocation.MapsActivity$AsyncTaskGetMareker.doInBackground(MapsActivity.java:102)

    at android.os.AsyncTask$2.call(AsyncTask.java:304) W/System.err:     at

java.util.concurrent.FutureTask.run(FutureTask.java:237) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) W / System.err:在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 在 java.lang.Thread.run(Thread.java:762)

这是我的地图活动代码

  @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_maps);
            // Obtain the SupportMapFragment and get notified when the map is ready to be used.
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);

        
        @Override
        public void onMapReady(GoogleMap googleMap) 
            mMap = googleMap;

            gps = new TrackGPS(MapsActivity.this);
            new AsyncTaskGetMareker().execute();
            /*
            if(gps.canGetLocation())
                currentLoc= new LatLng(gps.getLatitude(),gps.getLongitude());
                Log.d(TAG, "onMapReady: Got Location: " +gps.getLatitude() + " " + gps.getLongitude());
                // Add a marker in Sydney and move the camera
                mMap.addMarker(new MarkerOptions()
                        .position(currentLoc)
                        .title("CurrentLocation"));
                Log.d(TAG, "onMapReady: Displaying Map");
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLoc,15));
            else
                gps.showAlert();
            
            */
        

        public String getJSONFromAssets() 
            String json = null;
            try 
                InputStream inputData = getAssets().open("gameStores.json");
                int size = inputData.available();
                byte[] buffer = new byte[size];
                inputData.read(buffer);
                inputData.close();
                json = new String(buffer, "UTF-8");
             catch (IOException ex) 
                ex.printStackTrace();
                return null;
            
            return json;
        

        private class AsyncTaskGetMareker extends AsyncTask<String , String, JSONArray> 
            @Override
            protected void onPreExecute() 
                super.onPreExecute();
            

            @Override
            protected JSONArray doInBackground(String... strings) 
                String stationsJsonString = getJSONFromAssets();
                try 
                    JSONArray stationsJsonArray = new JSONArray(stationsJsonString);
                    return stationsJsonArray;
                 catch (JSONException e) 
                    e.printStackTrace();
                
                //This will only happen if an exception is thrown above:
                return null;
            

            protected void onPostExecute (JSONArray result)
                if (result !=null)
                    for (int i =0; i <result.length(); i++)
                        JSONObject jsonObject= null;
                        try 
                            jsonObject= result.getJSONObject(i);
                            String name=jsonObject.getString("name");
                            String lat=jsonObject.getString("lat");
                            String lang=jsonObject.getString("lang");

                            drawMarker(new LatLng(Double.parseDouble(lat),
                                    Double.parseDouble(lang)), name);

                         catch (JSONException e) 
                            e.printStackTrace();
                        
                    
                

            

            private void drawMarker(LatLng point, String name) 
                MarkerOptions markerOptions = new MarkerOptions();
                markerOptions.position(point);
                markerOptions.snippet(name);
                mMap.addMarker(markerOptions);
            
        

这是我的 json 文件

>

     "predictions" : [
>       
>          "description" : "GAME Paisley, High Street, Paisley, UK",
>          "id" : "d4fafbac99296d0a545170bb9af984e6251ac917",
>          "matched_substrings" : [
>             
>                "length" : 4,
>                "offset" : 0
>             
>          ],
>          "place_id" : "ChIJN0z6gTdJiEgREKQBicnWcAs",
>          "reference" : "ChIJN0z6gTdJiEgREKQBicnWcAs",
>          "structured_formatting" : 
>             "main_text" : "GAME Paisley",
>             "main_text_matched_substrings" : [
>                
>                   "length" : 4,
>                   "offset" : 0
>                
>             ],
>             "secondary_text" : "High Street, Paisley, UK"
>          ,
>          "terms" : [
>             
>                "offset" : 0,
>                "value" : "GAME Paisley"
>             ,
>             
>                "offset" : 14,
>                "value" : "High Street"
>             ,
>             
>                "offset" : 27,
>                "value" : "Paisley"
>             ,
>             
>                "offset" : 36,
>                "value" : "UK"
>             
>          ],
>          "types" : [ "establishment" ]
>       ,
>       
>          "description" : "GAME Glasgow Union Street, Union Street, Glasgow, UK",
>          "id" : "9579c1d2df7575a2eb479ccd987cf29ab0ab9c6e",
>          "matched_substrings" : [
>             
>                "length" : 4,
>                "offset" : 0
>             
>          ],
>          "place_id" : "ChIJ2YlAjJ5GiEgRu7aBLOFlkkc",
>          "reference" : "ChIJ2YlAjJ5GiEgRu7aBLOFlkkc",
>          "structured_formatting" : 
>             "main_text" : "GAME Glasgow Union Street",
>             "main_text_matched_substrings" : [
>                
>                   "length" : 4,
>                   "offset" : 0
>                
>             ],
>             "secondary_text" : "Union Street, Glasgow, UK"
>          ,
>          "terms" : [
>             
>                "offset" : 0,
>                "value" : "GAME Glasgow Union Street"
>             ,
>             
>                "offset" : 27,
>                "value" : "Union Street"
>             ,
>             
>                "offset" : 41,
>                "value" : "Glasgow"
>             ,
>             
>                "offset" : 50,
>                "value" : "UK"
>             
>          ],
>          "types" : [ "establishment" ]
>       ,
>       
>          "description" : "Game, Saint Enoch Square, Glasgow, UK",
>          "id" : "582edc64f3d6654d8ff9a8da364c37a8e0544102",
>          "matched_substrings" : [
>             
>                "length" : 4,
>                "offset" : 0
>             
>          ],
>          "place_id" : "ChIJq2yljp5GiEgRpsnAfUFKGEA",
>          "reference" : "ChIJq2yljp5GiEgRpsnAfUFKGEA",
>          "structured_formatting" : 
>             "main_text" : "Game",
>             "main_text_matched_substrings" : [
>                
>                   "length" : 4,
>                   "offset" : 0
>                
>             ],
>             "secondary_text" : "Saint Enoch Square, Glasgow, UK"
>          ,
>          "terms" : [
>             
>                "offset" : 0,
>                "value" : "Game"
>             ,
>             
>                "offset" : 6,
>                "value" : "Saint Enoch Square"
>             ,
>             
>                "offset" : 26,
>                "value" : "Glasgow"
>             ,
>             
>                "offset" : 35,
>                "value" : "UK"
>             
>          ],
>          "types" : [ "establishment" ]
>       ,
>       
>          "description" : "GAME Glasgow King's Inch Road, King's Inch Road, Glasgow, UK",
>          "id" : "b60dbbc529f25226dfee4c05c80de8e92137588d",
>          "matched_substrings" : [
>             
>                "length" : 4,
>                "offset" : 0
>             
>          ],
>          "place_id" : "ChIJv2Te_ENPiEgRknxQydZhR8Q",
>          "reference" : "ChIJv2Te_ENPiEgRknxQydZhR8Q",
>          "structured_formatting" : 
>             "main_text" : "GAME Glasgow King's Inch Road",
>             "main_text_matched_substrings" : [
>                
>                   "length" : 4,
>                   "offset" : 0
>                
>             ],
>             "secondary_text" : "King's Inch Road, Glasgow, UK"
>          ,
>          "terms" : [
>             
>                "offset" : 0,
>                "value" : "GAME Glasgow King's Inch Road"
>             ,
>             
>                "offset" : 31,
>                "value" : "King's Inch Road"
>             ,
>             
>                "offset" : 49,
>                "value" : "Glasgow"
>             ,
>             
>                "offset" : 58,
>                "value" : "UK"
>             
>          ],
>          "types" : [ "establishment" ]
>       ,
>       
>          "description" : "GAME, Cowglen Road, Glasgow, UK",
>          "id" : "86a4ed10b3b9b609f68533f1c47dc8f9ae5d2aee",
>          "matched_substrings" : [
>             
>                "length" : 4,
>                "offset" : 0
>             
>          ],
>          "place_id" : "ChIJT3vEiYRIiEgR4EIqP8jmL6o",
>          "reference" : "ChIJT3vEiYRIiEgR4EIqP8jmL6o",
>          "structured_formatting" : 
>             "main_text" : "GAME",
>             "main_text_matched_substrings" : [
>                
>                   "length" : 4,
>                   "offset" : 0
>                
>             ],
>             "secondary_text" : "Cowglen Road, Glasgow, UK"
>          ,
>          "terms" : [
>             
>                "offset" : 0,
>                "value" : "GAME"
>             ,
>             
>                "offset" : 6,
>                "value" : "Cowglen Road"
>             ,
>             
>                "offset" : 20,
>                "value" : "Glasgow"
>             ,
>             
>                "offset" : 29,
>                "value" : "UK"
>             
>          ],
>          "types" : [ "establishment" ]
>           ],    "status" : "OK" 

【问题讨论】:

【参考方案1】:

org.json.JSONObject 无法转换为 JSONArray

您的根节点是 JSONObject,但您正在使用 JSONArray 解析它。

替换

JSONArray stationsJsonArray = new JSONArray(stationsJsonString);

JSONObject stationsJsonObject = new JSONObject(stationsJsonString);

【讨论】:

以上是关于解析本地 Json 文件时的 JsonExeption的主要内容,如果未能解决你的问题,请参考以下文章

解析 JSON 文件(本地存储),从而快速创建对象数组

使用 jQuery 和 Javascript 解析本地 JSON 文件

使用搜索字符串解析本地 JSON 文件

如何从本地 JSON 文件解析数据并保存在模型类中并在 tableview 中使用

使用 Retrofit 解析本地 JSON 文件中的文本

Flutter 从本地化 JSON 文件解析数组