Проблема с анализом массива json внутри массива json

У меня проблемы с анализом простого JSON в Java. Вот образец JSON.

[
  {
    "politics": [
      {
        "type": "admin2",
        "friendly_type": "country",
        "name": "United States",
        "code": "usa"
      },
      {
        "type": "admin6",
        "friendly_type": "county",
        "name": "Gratiot",
        "code": "26_057"
      },
      {
        "type": "constituency",
        "friendly_type": "constituency",
        "name": "Eighth district, MI",
        "code": "26_08"
      },
      {
        "type": "admin6",
        "friendly_type": "county",
        "name": "Clinton",
        "code": "26_037"
      },
      {
        "type": "admin4",
        "friendly_type": "state",
        "name": "Michigan",
        "code": "us26"
      },
      {
        "type": "constituency",
        "friendly_type": "constituency",
        "name": "Fourth district, MI",
        "code": "26_04"
      }
    ],
    "location": {
      "latitude": 43.111976,
      "longitude": -84.71275
    }
  }
]

Теперь это дает мне правильный индекс JSON.

JSONParser parser = new JSONParser();
Object obj = parser.parse(output);
JSONArray array = (JSONArray)obj;
String jsonobj = array.get(0).toString();
{"politics":[{"code":"usa","name":"United States","type":"admin2","friendly_type":"country"},{"code":"26_057","name":"Gratiot","type":"admin6","friendly_type":"county"},{"code":"26_08","name":"Eighth district, MI","type":"constituency","friendly_type":"constituency"},{"code":"26_037","name":"Clinton","type":"admin6","friendly_type":"county"},{"code":"us26","name":"Michigan","type":"admin4","friendly_type":"state"},{"code":"26_04","name":"Fourth district, MI","type":"constituency","friendly_type":"constituency"}],"location":{"latitude":43.111976,"longitude":-84.71275}}

Но я, кажется, не могу получить атрибут, который я хочу от него.

JSONObject obj1 = new JSONObject(jsonobj);
String n = obj1.getString("admin4");
System.out.println(n);

Все, что мне нужно от этого Джонсона, это штат Мичиган. Где я не прав? Помощь была бы очень признательна.

3 ответа

Решение

Первый, array.get(0) получите первый элемент из основного массива. Этот первый элемент является объектом JSON, который имеет два свойства politics а также location, Вы, кажется, заинтересованы в значении, которое находится внутри значения массива politics имущество. Вам придется использовать это ((JSONArray)((JSONObject)array.get(0)).get("politics")) чтобы получить этот массив.

Во-вторых, admin4 это не свойство, это на самом деле значение type имущество. Вам нужно будет перебрать массив, чтобы найти его.

Вот полный пример:

JSONParser parser = new JSONParser();
Object obj = parser.parse(output);
JSONArray array = (JSONArray)obj;
JSONArray politics = ((JSONObject)array.get(0)).get("politics"));
JSONObject obj = null;
for(int i = 0; i < politics.size(); i++){
    if(((JSONObject)politics.get(i)).getString("type").equals("admin4")){
        obj = ((JSONObject)politics.get(i));
    }
}
if(obj != null){
    // Do something with the object.
}

Кажется, вы используете simple json библиотека. Я не помню точно, если это .get("politics") или же .getJSONObject("politics"), В моем примере могут быть другие ошибки в именах методов.

Лучшее решение для упрощения поиска и других операций над объектом json - это преобразование строки json в объект java и выполнение ваших операций.

для преобразования строки json в объект java используйте следующий код:

  import org.codehaus.jackson.map.ObjectMapper;
  import org.json.JSONException;
  import org.json.JSONObject; 

YourObject myObject;
ObjectMapper mapper = new ObjectMapper();
try{
    myObject= mapper.readValue(jsonData, myObject.class);
}
catch (Exception e) {
    e.printStackTrace();
}

Например, определите вашу классную задницу следующим образом:

public class myObject{

      private List<Politics> politics;
      private Location location;
      // define getters and setters
}

define Politics and Location class:

public class Politics
{
      String  type;
      String  friendly_type;
      String  name;
      String  code;
      // define getters and setters
}

public class Location
{
  String latitude;
  String longitude;
   // define getters and setters
}

Это потому, что вы пытаетесь получить внутренний элемент объекта JSON. пытаться

JSONObject obj1 = new JSONObject(jsonobj);
JSONArray arr = (JSONArray) obj1.getObject("politics");

Вы получите объект JSONArray, который в дальнейшем состоит из объектов JSON. Теперь, чтобы получить значения, используя ключ, вы должны выполнить итерацию массива, как показано ниже:

for(int i=0; i<arr.size(); i++){
    JSONObject obj = arr.getJSONArray(i);
    System.out.println(obj.getString("type"));
}

который теперь предоставит вам вывод:

admin2
admin6
constituency
admin6
admin4
constituency
Другие вопросы по тегам