Разбор JSON через URL с использованием Volley - PullRequest
0 голосов
/ 16 ноября 2018

Я попытался проанализировать данные JSON, которые я получил от URL, используя залп.Но это не работает должным образом.Я не могу понять разницу между jasonArray и jasonObject.

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private ExampleAdapter mExampleAdapter;
    private ArrayList<ExampleItem> mExampleList;
    private RequestQueue mRequestQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        mExampleList = new ArrayList<>();

        mRequestQueue = Volley.newRequestQueue(this);
        parseJSON();
    }

    private void parseJSON() {
        String url = "http://api.visitkorea.or.kr/openapi/service/rest/KorService/locationBasedList?" +
        "serviceKey=gCoROJjTpFwTjV%2F%2BoWBcWMdj0z%2Fxsu22eY19j%2FoeNSJOnrkaPehhoyIzp%2FrtMkNYAzVlBFzmnI6cCsKODNmejA%3D%3D&" +
                "numOfRoews=10&pageNo=1&startPage=1&MobileOS=AND&MobileApp=WelcomeToSeoul&_type=json&arrange=A&contenTypeId=15&mapX=126.981611&mapY=37.568477&radius=1000&listYN=Y";

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONObject parse_respone = response.getJSONObject("response");
                            JSONObject parse_body = parse_respone.getJSONObject("body");
                            JSONObject parse_items = parse_body.getJSONObject("items");
                            JSONArray jsonArray = parse_items.getJSONArray("item");

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject hit = jsonArray.getJSONObject(i);

                                String creatorName = hit.getString("title");
                                String imageUrl = hit.getString("firstimage");
                                int likeCount = hit.getInt("siguncode");

                                mExampleList.add(new ExampleItem(imageUrl, creatorName, likeCount));
                            }

                            mExampleAdapter = new ExampleAdapter(MainActivity.this, mExampleList);
                            mRecyclerView.setAdapter(mExampleAdapter);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });

        mRequestQueue.add(request);
    }
}

И данные, которые я получил с URL:

{
"response": {
    "header": {
        "resultCode": "0000",
        "resultMsg": "OK"
    },
    "body": {
        "items": {
            "item": [
                {
                    "addr1": "서울특별시 중구 세종대로 110",
                    "areacode": 1,
                    "cat1": "A02",
                    "cat2": "A0207",
                    "cat3": "A02070200",
                    "contentid": 1742496,
                    "contenttypeid": 15,
                    "createdtime": 20121029114117,
                    "dist": 355,
                    "firstimage": "http://tong.visitkorea.or.kr/cms/resource/17/2560517_image2_1.jpg",
                    "firstimage2": "http://tong.visitkorea.or.kr/cms/resource/17/2560517_image2_1.jpg",
                    "mapx": 126.9783710306,
                    "mapy": 37.5665986816,
                    "mlevel": 6,
                    "modifiedtime": 20180917153230,
                    "readcount": 12165,
                    "sigungucode": 24,
                    "tel": "053-743-2882~5, 053-961-8969",
                    "title": "경북착한사과 페스티벌 2018"
                },

Я много искал, но не могу решить проблему.Пожалуйста, помогите мне решить проблему.

1 Ответ

0 голосов
/ 16 ноября 2018

Ваша логика кода в основном верна. Я скопировал ваш код в мой проект и протестировал его. И я узнал, почему твой код не работает.

Пожалуйста, взгляните на следующую строку кода.

int likeCount = hit.getInt("siguncode");

В вашем ответе json нет поля siguncode. Вместо этого у вас есть sigungucode поле. Вот почему ваш код не работает.

PS: разница между JSONObject и JSONArray

JSONObject - это просто объект с картами ключ / значение.

JSONArray - это коллекция с одним или несколькими объектами JSONObject.

В вашем примере JSON "header" - это JSONObject. И "item" в "items" - это JSONArray.

EDIT

Чтобы исправить вашу проблему, вы должны сделать следующее. Просто замените строку кода:

int likeCount = hit.getInt("siguncode");

с этим:

int likeCount = hit.getInt("sigungucode");

РЕДАКТИРОВАТЬ для первого изображения

for (int i = 0; i < jsonArray.length(); i++) {
    JSONObject hit = jsonArray.getJSONObject(i);

    String creatorName = hit.getString("title");
    String imageUrl = hit.getString("firstimage");
    int likeCount = hit.getInt("sigungucode");
    String firstimage = "";
    if (hit.has("firstimage")) {
        firstimage = hit.getString("firstimage");
    }

    mExampleList.add(new ExampleItem(imageUrl, creatorName, likeCount));
}
...