JSONException при попытке получить значение из Json в String

Список имеет встроенную функцию .index:

my_list = ['hi', 'babe', 'hi', 'babe', 'key', 'key']
my_list.index('hi')
>>>0

.index выполняет поиск по списку, пока не найдет совпадение и не остановится. Если вам понадобятся индексы большего количества совпадений, вы должны использовать понимание списка. Во-первых, вам может понадобиться преобразовать текст в цифры (списки чисел не нужны), например, hi = 0, babe = 1 и т. Д. Это должно быть сделано (может быть, лучше):

unique_words_list = []
number_list = []
for word in my_list:
    if word not in unique_words_list:
    unique_words_list.append(word)
for i in range(len(my_list)):
    for j in range(len(unique_words_list)):
        if my_list[i]==unique_words_list[j]:
            number_list.append(j)


unique_words_list, number_list    
>>>(['hi', 'babe', 'key'], [0, 1, 0, 1, 2, 2])    

Тогда ваше понимание списка:

[i for i, e in enumerate(number_list) if e == 1]
>>>[1,3]

Это означает, что у вас есть «младенец» на 1-й и 3-й позиции в вашем списке.

Возможно, это будет проще! Надеюсь, это поможет.

0
задан Ilia Naleva 19 January 2019 в 17:18
поделиться

5 ответов

Так как ID постоянно менялся, я решил пойти другим путем. Я использовал следующий код:

    Pattern p = Pattern.compile("\"source\":\"(.*?)\",\"width");
    Matcher m = p.matcher(responseSB);

        if (m.find()) {
            url = m.group(1);
        }

        p = Pattern.compile("\"title\":(.*?)\",\"thumbnail");
        m = p.matcher(responseSB);

        if (m.find()) {
            description = m.group(1);
        }
0
ответ дан Ilia Naleva 19 January 2019 в 17:18
поделиться

Вы должны знать, что идентификатор страницы изменится, а миниатюра не обязательна.

      // new code
      JSONObject incomingJSON = new JSONObject(responseSB);
      JSONObject pages = incomingJSON.getJSONObject("query").getJSONObject("pages");
      Iterator<String> it = pages.keys();

      while(it.hasNext()) {
          JSONObject page = pages.getJSONObject(it.next());
          String mTitle= page.getString("title");
          if(page.keySet().contains("thumbnail")) {
              String mUrl= page.getJSONObject("thumbnail").getString("source");
          }
      }
0
ответ дан Jens Dibbern 19 January 2019 в 17:18
поделиться

Если вы заметили JSON, он генерируется случайным образом, но с определенным форматом

Случай 1

{
"batchcomplete": "",
"continue": {
    "grncontinue": "0.720220803439|0.720221273467|12887566|0",
    "continue": "grncontinue||"
},
"query": {
    "pages": {
        "4897672": {
            "pageid": 4897672,
            "ns": 0,
            "title": "New Hope, Sunnyvale, Texas"
        }
    }
  }
}

query и pages существовал всегда, и на страницах ключ всегда генерируется случайным образом, так что это Map<String, JSONObject> карта ключа String и JSONObject в качестве значения. Затем вам нужно получить значение title из значений карты

String API = "https://en.wikipedia.org/w/api.php?action=query&generator=random&grnnamespace=0&prop=pageimages&format=json&pithumbsize=500&utf8";

    //open connection with wikipedia.
    HttpURLConnection httpcon = (HttpURLConnection) new URL(API).openConnection();

    //read all the input from wikipedia.
    BufferedReader in = new BufferedReader(new InputStreamReader(httpcon.getInputStream()));
    String responseSB = in.lines().collect(Collectors.joining());
    in.close();
    JSONObject incomingJSON = new JSONObject(responseSB);

  Map<String,JSONObject> map =  (Map<String, JSONObject>) incomingJSON.getJSONObject("query").getJSONObject("pages");

  map.forEach((k,v)->System.out.println(" The key is : "+k+" the title is : "+v.getString("title")));

] Случай 2 С источником

{
"batchcomplete": "",
"continue": {
    "grncontinue": "0.165621850014|0.165622038679|37982311|0",
    "continue": "grncontinue||"
},
"query": {
    "pages": {
        "57529788": {
            "pageid": 57529788,
            "ns": 0,
            "title": "Model Store",
            "thumbnail": {
                "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Australia_New_South_Wales_relief_location_map.png/500px-Australia_New_South_Wales_relief_location_map.png",
                "width": 500,
                "height": 443
            },
            "pageimage": "Australia_New_South_Wales_relief_location_map.png"
            }
        }
    }
}

Так что source может присутствовать не в каждом ответе, обработайте с помощью try catch

String API = "https://en.wikipedia.org/w/api.php?action=query&generator=random&grnnamespace=0&prop=pageimages&format=json&pithumbsize=500&utf8";

    //open connection with wikipedia.
    HttpURLConnection httpcon = (HttpURLConnection) new URL(API).openConnection();

    //read all the input from wikipedia.
    BufferedReader in = new BufferedReader(new InputStreamReader(httpcon.getInputStream()));
    String responseSB = in.lines().collect(Collectors.joining());
    in.close();
    JSONObject incomingJSON = new JSONObject(responseSB);

  Map<String,JSONObject> map =  (Map<String, JSONObject>) incomingJSON.getJSONObject("query").getJSONObject("pages");

  map.forEach((k,v)->{
      System.out.println(" The key is : "+k+" the title is : "+v.getString("title"));  

      //use try catch to get source because you will not get the same response every time

      String source = v.getJSONObject("thumbnail").getString("source");
  });


}
0
ответ дан Deadpool 19 January 2019 в 17:18
поделиться

попробуй это ...

JSONObject incomingJSON = new JSONObject(responseSB);

JSONObject TitleObjects = incomingJSON.getJSONObject("query");
JSONObject j_Objects_01 = TitleObjects.getJSONObject("pages");
JSONObject j_Objects_02 = j_Objects_01.getJSONObject("38690716");

String mTitle = j_Objects_02.getString("title");
JSONObject j_Objects_03 = j_Objects_02.getJSONObject("thumbnail");
String mUrl = j_Objects_03.getString("source");
0
ответ дан Rajasimman 19 January 2019 в 17:18
поделиться

Вы не можете получить заголовок и источник напрямую из ответа JSON, потому что он должен содержать несколько внутренних объектов. Ниже приведен фрагмент кода для чтения заголовка и источника.

// new code
JSONObject incomingJSON = new JSONObject(responseSB);
JSONObject innerObject = incomingJSON.getJsonObject("query").getJsonObject("pages").getJsonObject("38690716");
String mTitle= innerObject.getString("title");
String mUrl= innerObject.getJsonObject("thumbnail").getString("source");


//crashes here
String mTitle = incomingJSON.getString("title");
String mUrl = incomingJSON.getString("source");
0
ответ дан Ompratap Singh 19 January 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: