Что находится в неизвестном объекте/массиве JSON?

Я хочу получить список имен друзей из API Facebook в Android. В этом процессе я хочу научиться читать объекты/массивы JSON.

У меня есть JSONObject и/или JSONArrays, которые были переданы мне. Я не знаю, что в них*. Я знаю, как читать данные, когда знаю, какие поля существуют, но, насколько я могу судить, я ничего не могу прочитать без ключа. Даже с ключом, как я могу сказать, что в нем?

В принципе, я хотел бы кусок кода, который выглядит так:

JSONArray mArray = response.getJSONArray();
String theEntireDatabase = mArray.getStringOFEntireDatabase();

и пусть он ответит строкой, которая выглядит так:

{
   "phoneNumber": [
      {
         "type": "work",
         "num": "11111"
      },
      {
         "type": "home",
         "num": "2222"
      }
   ],
   "address": {
      "state": "World",
      "address": "infinite space, 000",
      "city": "Android city"
   },
   "surname": "Swa",
   "name": "Android"
}

Ничего не зная заранее о том, что находится в базе данных?

* это может быть «цвет:», это может быть «уровень ядерной угрозы:», насколько я знаю.

Я пробовал это, но он дает только ключи: Javascript получает имя ключа JSON


person Glen Pierce    schedule 28.07.2015    source источник


Ответы (4)


JSONArray mArray = response.getJSONArray();
String theEntireDatabase = mArray.toString();

Это должно работать хорошо.
Если вы хотите, чтобы JSONArray красиво распечатывался, вы можете добавить это после кода, который я вам только что предоставил.

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(theEntireDatabase);
String prettyJsonString = gson.toJson(je); 
person arodriguezdonaire    schedule 28.07.2015

JSONObject#keys сообщит вам, какие ключи определены для объекта. . JSONArray#length сообщит вам, сколько записей содержится в массиве. (и, следовательно, диапазон значений, которые вы можете использовать для index с другими методами: от 0 до length() - 1). JSONObject#toString/JSONArray#toString предоставит вам запрошенную строку.

person T.J. Crowder    schedule 28.07.2015

Взгляните на встроенную функцию модели дерева Джексона. http://wiki.fasterxml.com/JacksonTreeModel

И ваш код будет:

public void parse(String json)  {
       JsonFactory factory = new JsonFactory();

       ObjectMapper mapper = new ObjectMapper(factory);
       JsonNode rootNode = mapper.readTree(json);  

       Iterator<Map.Entry<String,JsonNode>> fieldsIterator = rootNode.fields();
       while (fieldsIterator.hasNext()) {

           Map.Entry<String,JsonNode> field = fieldsIterator.next();
           System.out.println("Key: " + field.getKey() + "\tValue:" + field.getValue());
       }
}
person Archit Garg    schedule 28.07.2015

помимо технических ответов (JSONObject#toString(n) кажется самым простым - см. http://developer.android.com/reference/org/json/JSONObject.html),

Я бы часто использовал два более прагматичных решения:

  1. поищите документацию по API... Знаю, звучит дико, но некоторые компании предлагают такую ​​штуку
  2. соберите короткий сценарий javascript, чтобы попробовать API, и проверьте результат в консоли разработчика/firebug/в любом удобном месте
person cypherabe    schedule 28.07.2015
comment
Ссылка разработчика немного разочаровала, но найти метод .toString() было ключом. - person Glen Pierce; 28.07.2015