簡體   English   中英

如何一次解析JSONObject和JSONArray

[英]How to Parse JSONObject and JSONArray at one time

我正在使用一個使用JSON響應的應用程序,該應用程序同時具有JSONObject和JSONArray。 這兩個信息都需要在地圖上放置標記。 但是我在解析這兩個方面都遇到了問題。

當我打電話給我的URl時,這是我的回復

{
-source: {
LS: " ABCDEF",
name: "XYXA",
point: "77.583859,12.928751"
},
 -stores: [
    -{
    ph: null,
    distance: "0.3",
    LS: " abcd",
    id: 1209,
    name: "xyz",
    point: "77.583835,12.926359"
    },
-{
    ph: null,
    distance: "0.3",
    LS: " abcd",
    id: 1209,
    name: "xyz",
    point: "77.583835,12.926359"
    }
    ]
}

這就是我嘗試處理JSON響應的方式

public class JSONResponseHandler implements ResponseHandler<List<LatlongRec>> {
        @Override
        public List<LatlongRec> handleResponse(HttpResponse response)
                throws ClientProtocolException, IOException {
            List<LatlongRec> result = new ArrayList<LatlongRec>();
            String JSONResponse = new BasicResponseHandler()
                    .handleResponse(response);


            try {

                JSONObject object = (JSONObject)new JSONTokener(JSONResponse)
                        .nextValue();

                JSONArray stores = object.getJSONArray("stores");
                for (int i = 0; i < stores.length(); i++) {
                    JSONObject tmp = (JSONObject) stores.get(i);
                    result.add(new LatlongRec(tmp.getString("point"), tmp
                            .getString("name"), tmp.getString("LS"), tmp
                            .getString("ph")));
                    Log.v("points", "" + tmp.getString("point"));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return result;
        }
    }

在這個LatlongRec是一個我創建構造函數和getter的類。

這是我的主要活動

public class SecondActivity extends Activity {
    private static final double CAMERA_LNG = 77.583859;
    private static final double CAMERA_LAT = 12.928751;
    // The Map Object
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        String city = getIntent().getStringExtra("city");
        String area1 = getIntent().getStringExtra("area");
        String area = area1.trim();

        String URL = "http://xyzxyz.search.json?query="
                + area + "&city=" + city + "&app_id=test";
        new HttpGetTask().execute(URL);
    }

    private class HttpGetTask extends AsyncTask<String, Void, List<LatlongRec>> {
        AndroidHttpClient mClient = AndroidHttpClient.newInstance("");

        @Override
        protected List<LatlongRec> doInBackground(String... params) {
            HttpGet request = new HttpGet(params[0]);
            JSONResponseHandler responseHandler = new JSONResponseHandler();
            try {

                return mClient.execute(request, responseHandler);
            } catch (ClientProtocolException e) {
            } catch (IOException e) {
            }
            return null;
        }

        @SuppressLint("NewApi")
        protected void onPostExecute(List<LatlongRec> result) {
            // Get Map Object
            mMap = ((MapFragment) getFragmentManager().findFragmentById(
                    R.id.map)).getMap();
            if (null != mMap) {
                // Add a marker for every earthquake
                for (final LatlongRec rec : result) {
                    Log.v("pointM", "" + rec.getPoint());
                    Log.v("NAMES", "" + rec.getName());

                    String point = rec.getPoint();
                    String[] latlng = point.split(",");
                    String lat = latlng[0];
                    String lng = latlng[1];

                    Double lat1 = Double.parseDouble(lat);
                    Double lng1 = Double.parseDouble(lng);



                    Log.v("LATLNGM", "lat" + lng + "& lng " + lat);
                    // Add a new marker for each point
                    mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(lng1, lat1))
                            .title(rec.getName())
                            .snippet(rec.getLS() + rec.getPh())
                            .icon(BitmapDescriptorFactory
                                    .fromResource(R.drawable.main_marker)));
                // Setting a custom info window adapter for the google map
                CameraPosition cp = new CameraPosition(new LatLng(CAMERA_LAT,
                        CAMERA_LNG), 15, 40, 90);
                mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp));
            }
            if (null != mClient)
                mClient.close();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.second, menu);
        return true;
    }
}

如何將源對象中的點添加到我的主要活動中,以便我可以從該點將CAMERA_LAT和CAMERA_LNG設置為Lat和Lng。

我是JSON的新手,請幫我解決這個問題。

感謝您

String point[] = jsonObject.getJSONObject("source").getString("point").split(",");
double lat = Double.parseDouble(point[0]);
double lon = Double.parseDouble(point[1]);

應該讓你獲得積分。

如果您正在尋找其他活動,則應將它們放入Bundle並將它們傳遞給下一個活動。 是一篇解釋如何傳遞捆綁的帖子。

試試一個解串器。 我使用谷歌GSON庫來解決我遇到的類似問題。 看看我如何解析json對象中的heroes數組。

public class GameDeserializer implements JsonDeserializer<Game> {

    public Game deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {
        JsonObject obj = json.getAsJsonObject().get("game").getAsJsonObject();

        String id = obj.get("id").getAsString();
        Integer turn = obj.get("turn").getAsInt();
        Integer maxTurns = obj.get("maxTurns").getAsInt();

        Hero[] heroes = new Hero[4];
        for (int i = 0; i < 4; i++) {
            heroes[i] = context.deserialize(obj.get("heroes").getAsJsonArray().get(i), Hero.class);
        }
        Board board = context.deserialize(obj.get("board"), Board.class);

        Hero player = context.deserialize(json.getAsJsonObject().get("hero"), Hero.class);

        String token = json.getAsJsonObject().get("token").getAsString();

        String viewUrl = json.getAsJsonObject().get("viewUrl").getAsString();

        String playUrl = json.getAsJsonObject().get("playUrl").getAsString();

        boolean finished = obj.get("finished").getAsBoolean();

        return new Game(id, turn, maxTurns, heroes, board, player, token, viewUrl, playUrl, finished);
    }

}
}

我不會回答,但你的問題很模糊,我不確定你是否需要json或String的幫助。 在后一種情況下,無視我的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM