Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
#1

Как по наименованию найти нужный обьект или массив в JSON - Android

07.07.2016, 23:02. Просмотров 296. Ответов 7
Метки нет (Все метки)

К примеру у меня есть JSON полученный в ответ на запрос к API Places и мне нужно в этом JSON пройти все объекты массива results и найти массив "photos". Как это сделать? Как по наименованию найти нужный обьект или массив в JSON?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2016, 23:02     Как по наименованию найти нужный обьект или массив в JSON
Посмотрите здесь:

Как перевести с gson на json код Android
Android Как распарсить JSON c Вконтакте API
Android Массив из json
Android Парсинг json, многомерный массив с разными типами данных
Android Ошибка - Errororg.json.JSONExceprion: Value bd.json of type java.lang.String cannot be converted to JSONObject
Android Подскажите как правильно распарсить json
Android Как правильно парсить json с сервера
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Zanexess
111 / 84 / 28
Регистрация: 22.10.2010
Сообщений: 225
08.07.2016, 11:28     Как по наименованию найти нужный обьект или массив в JSON #2
Например так в лоб.

Java
1
2
3
4
5
6
final String PHOTOS = "photos";
JSONArray jsonArray = new JSONArray(getRawData());
for (int i = 0; i < jsonArray.length(); i++) {
      JSONObject jsonObject = jsonArray.getJSONObject(i);
      JSONArray photos = jsonObject.getJSONArray(PHOTOS);
}
Но лучше использовать Gson, он умеет все это, или например мапить все в хэшмап.
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
08.07.2016, 14:09  [ТС]     Как по наименованию найти нужный обьект или массив в JSON #3
А как при помощи Gson это сделать? или HashMap?

Добавлено через 17 секунд
Можно примерчик небольшой

Добавлено через 16 минут
Еще такой вопрос - есть JSON получаю в ответ на запрос к OpenWeathermap APi
JSON
1
{"coord":{"lon":13.41,"lat":52.52},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"cmc stations","main":{"temp":300.21,"pressure":1015,"humidity":36,"temp_min":297.15,"temp_max":305.93},"wind":{"speed":5.7,"deg":240},"clouds":{"all":0},"dt":1467971757,"sys":{"type":1,"id":4892,"message":0.2043,"country":"DE","sunrise":1467946470,"sunset":1468006081},"id":2950159,"name":"Berlin","cod":200}
И мой метод парсинга таких JSONов

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
private String ParseJSON(String json){
 
            //Log.d("Func",json );
            String jsonResult = "";
 
            try {
                JSONObject JsonObject = new JSONObject(json);
                String cod = jsonHelperGetString(JsonObject, "cod");
 
                if(cod != null){
                    if(cod.equals("200")){
 
                        jsonResult += jsonHelperGetString(JsonObject, "name") + "\n";
                        JSONObject sys = jsonHelperGetJSONObject(JsonObject, "sys");
                        if(sys != null){
                            jsonResult += jsonHelperGetString(sys, "country") + "\n";
                        }
                        jsonResult += "\n";
 
                        JSONObject coord = jsonHelperGetJSONObject(JsonObject, "coord");
                        if(coord != null){
                            String lon = jsonHelperGetString(coord, "lon");
                            String lat = jsonHelperGetString(coord, "lat");
                            jsonResult += "lon: " + lon + "\n";
                            jsonResult += "lat: " + lat + "\n";
                        }
                        jsonResult += "\n";
 
                        JSONArray weather = jsonHelperGetJSONArray(JsonObject, "weather");
                        if(weather != null){
                            for(int i=0; i<weather.length(); i++){
                                JSONObject thisWeather = weather.getJSONObject(i);
                                jsonResult += "weather " +  ":\n";
                                jsonResult += "id: " + jsonHelperGetString(thisWeather, "id") + "\n";
                                jsonResult += jsonHelperGetString(thisWeather, "main") + "\n";
                                jsonResult += jsonHelperGetString(thisWeather, "description") + "\n";
                                jsonResult += "\n";
                            }
                        }
 
                        JSONObject main = jsonHelperGetJSONObject(JsonObject, "main");
                        if(main != null){
                            jsonResult += "temp: " + jsonHelperGetString(main, "temp") + "\n";
                            jsonResult += "pressure: " + jsonHelperGetString(main, "pressure") + "\n";
                            jsonResult += "humidity: " + jsonHelperGetString(main, "humidity") + "\n";
                            jsonResult += "temp_min: " + jsonHelperGetString(main, "temp_min") + "\n";
                            jsonResult += "temp_max: " + jsonHelperGetString(main, "temp_max") + "\n";
                            jsonResult += "sea_level: " + jsonHelperGetString(main, "sea_level") + "\n";
                            jsonResult += "grnd_level: " + jsonHelperGetString(main, "grnd_level") + "\n";
                            jsonResult += "\n";
                        }
 
                        jsonResult += "visibility: " + jsonHelperGetString(JsonObject, "visibility") + "\n";
                        jsonResult += "\n";
 
                        JSONObject wind = jsonHelperGetJSONObject(JsonObject, "wind");
                        if(wind != null){
 
                            jsonResult += "wind:\n";
                            jsonResult += "speed: " + jsonHelperGetString(wind, "speed") + "\n";
                            jsonResult += "deg: " + jsonHelperGetString(wind, "deg") + "\n";
                            jsonResult += "\n";
                        }
 
                        //...incompleted
 
                    }else if(cod.equals("404")){
                        String message = jsonHelperGetString(JsonObject, "message");
                        jsonResult += "cod 404: " + message;
                    }
                }else{
                    jsonResult += "cod == null\n";
                }
 
            } catch (JSONException e) {
                e.printStackTrace();
                jsonResult += e.getMessage();
            }
 
            return jsonResult;
        }
Но это метод не всегда выдает верные результаты например если в JSON "humidity":36, то я порой получаю "humidity":38. С чем это связано и как исправить?
Zanexess
111 / 84 / 28
Регистрация: 22.10.2010
Сообщений: 225
09.07.2016, 00:19     Как по наименованию найти нужный обьект или массив в JSON #4
yura91,
Создаете класс с полями как в вашей json, можно воспользоваться генераторами сразу, импортируете библиотеку и буквально в одну строку все парсите.
Вот примерчик, первая ссылка по запросу GSON

Примерно так можно с помощью этой библиотечки в map перевести. Мне это нужно было лишь однажды, когда что-то стандартно не получалось. Обычно со всем библиотека сама справляется.
Java
1
2
Type mapType = new TypeToken<Map<String, Map>>(){}.getType();  
Map<String, String[]> json = new Gson().fromJson(JSON, mapType);
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
09.07.2016, 15:45  [ТС]     Как по наименованию найти нужный обьект или массив в JSON #5
FATAL EXCEPTION: Thread-2017
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 10 path $.
at com.google.gson.Gson.fromJson(Gson.java:822)
at com.google.gson.Gson.fromJson(Gson.java:775)
at com.google.gson.Gson.fromJson(Gson.java:724)
at com.uifragmentsexample.user.gsonparsing.MainActivity.jsonToMap(MainActivity.java:98)
at com.uifragmentsexample.user.gsonparsing.MainActivity$1$1.run(MainActivity.java:67)
at java.lang.Thread.run(Thread.java:838)
Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 10 path $.
at com.google.gson.stream.JsonReader.nextString(JsonReader.java:837)
at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:358)
at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:346)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:775)*
at com.google.gson.Gson.fromJson(Gson.java:724)*
at com.uifragmentsexample.user.gsonparsing.MainActivity.jsonToMap(MainActivity.java:98)*
at com.uifragmentsexample.user.gsonparsing.MainActivity$1$1.run(MainActivity.java:67)*
at java.lang.Thread.run(Thread.java:838)*
Пробовал этот код, но он Падает с этой ошибкой

Добавлено через 8 минут
Все решил

Добавлено через 8 минут
Примерно так можно с помощью этой библиотечки в map перевести
А как потом из этого Map достать нужные мне JSON значения? Ну с map как дальше работать?
Zanexess
111 / 84 / 28
Регистрация: 22.10.2010
Сообщений: 225
09.07.2016, 19:19     Как по наименованию найти нужный обьект или массив в JSON #6
Цитата Сообщение от yura91 Посмотреть сообщение
Ну с map как дальше работать?
Доки, гугл, учебники по джаве.
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
14.07.2016, 21:29  [ТС]     Как по наименованию найти нужный обьект или массив в JSON #7
Java
1
2
Type mapType = new TypeToken<Map<String, Map>>(){}.getType();  
Map<String, String[]> json = new Gson().fromJson(JSON, mapType);
Проблема в том что этот код падает с ошибкой. А вот в строке TypeToken<Map<String, Map>>(){}.getType(); объявляется TypeToken в котором Map<String, Map> а внутри Map есть еще объект Map так вот этот внутренний Map(который Map<String, Map - вот это объект>) надо до этого кода ранее где то инициализировать или нет?и если да то в какой момент это нужно делать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2016, 12:11     Как по наименованию найти нужный обьект или массив в JSON
Еще ссылки по теме:

Как сформировать нужный макет Android
Как распарсить такой JSON Android
Json в массив Android
Как правильно распарсить Json? Android
Android XML или JSON

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Паблито
2013 / 1755 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
15.07.2016, 12:11     Как по наименованию найти нужный обьект или массив в JSON #8
строка-json из сообщения 3 парсится тупо одной строкой
Java
1
WeatherResponse object = new Gson().fromJson(json, WeatherResponse.class);
подключена библиотека
Java
1
compile 'com.google.code.gson:gson:2.7'
и сам класс-модель
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class WeatherResponse {
 
    public String id;
    public String dt;
    public Clouds clouds;
    public Coord coord;
    public Wind wind;
    public String cod;
    public Sys sys;
    public String name;
    public String base;
    public Weather[] weather;
    public Main main;
 
    public static class Sys {
        public String message;
        public String id;
        public String sunset;
        public String sunrise;
        public String type;
        public String country;
    }
 
    public static class Clouds {
        public String all;
    }
 
    public static class Wind {
        public String speed;
 
        public String deg;
    }
 
    public static class Main {
        public String humidity;
        public String pressure;
        public String temp_max;
        public String temp_min;
        public String temp;
    }
 
    public static class Weather {
        public String id;
        public String icon;
        public String description;
        public String main;
    }
 
    public static class Coord {
        public String lon;
        public String lat;
    }
}
Yandex
Объявления
15.07.2016, 12:11     Как по наименованию найти нужный обьект или массив в JSON
Ответ Создать тему
Опции темы

Текущее время: 09:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru