Как перемещаться по вложенным данным JSON с помощью java

Я пытаюсь получить значения Alpha, Beta и Gamma из вложенного файла данных JSON.

Я пытаюсь получить значение Alpha, используя что-то вроде этого

Object o = new JSONParser().parse(new FileReader(newFile("C:\\Users\\abc\\Documents\\file.json")));
JSONObject jo = (JSONObject) o;

JSONArray resultCode = (JSONArray) jo.get("mkDetails");

JSONObject x = (JSONObject) resultCode.get(0);
x.get("Alpha").toString()       

Это JSON:

{
  "metadata": {
    "offset": 0,
    "psize": 10
  },
  "svc": [
    {
      "mNumber": "225",
      "markIp": {
        "Name": "Ant",
        "eDate": "3006-08-01",
        "cDate": "9999-12-31"
      },
      "mkDetails": [
        {
          "Alpha": "D",
          "Beta": "S"
        }
      ],
      "mNetDetails": [
        {
          "Gaama": "213",
          "mkTypeCode": "23"
        }
      ]
    }
  ],
  "serviceFault": {
    "faultType": null,
    "faultCode": null,
    "message": null
  }
}

Какую библиотеку JSON вы используете?

MTCoster 19.02.2019 15:46

@MTCoster Я импортировал следующие библиотеки ** import org.json.simple.JSONArray; импортировать org.json.simple.JSONObject; импортировать org.json.simple.parser.JSONParser; импортировать org.json.simple.parser.ParseException; **

Vamshi Verma 19.02.2019 15:50

Фрагмент отсутствует. Исправлено!

Vamshi Verma 19.02.2019 15:54

Для этого вы можете использовать JSONPath: например. $.[*].Alpha получит значение(я) Alpha.

bkis 19.02.2019 16:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не можете просто сделать jo.get("mkDetails"), потому что у jo нет ключа mkDetails. Вы должны пройти каждый уровень дерева самостоятельно:

JSONObject root = ...;

JSONArray svc = (JSONArray) root.get("svc");
JSONObject svc0 = (JSONObject) svc.get(0);
JSONObject mkDetails = (JSONObject) svc0.get("mkDetails");
JSONObject mNetDetails = (JSONObject) svc0.get("mNetDetails");

String alpha = (String) mkDetails.get("Alpha");
String beta = (String) mkDetails.get("Beta");
String gamma = (String) mNetDetails.get("Gamma");
Ответ принят как подходящий

Вот возможное решение. Я использую Gson lib от Google. Вы можете импортировать через maven.

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

Вот код, который анализирует ваш JSON.

    import com.google.gson.Gson;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;

    public static void parseJson (){

     String thisJson  = "{\r\n" + 
            "  \"metadata\": {\r\n" + 
            "    \"offset\": 0,\r\n" + 
            "    \"psize\": 10\r\n" + 
            "  },\r\n" + 
            "  \"svc\": [\r\n" + 
            "    {\r\n" + 
            "      \"mNumber\": \"225\",\r\n" + 
            "      \"markIp\": {\r\n" + 
            "        \"Name\": \"Ant\",\r\n" + 
            "        \"eDate\": \"3006-08-01\",\r\n" + 
            "        \"cDate\": \"9999-12-31\"\r\n" + 
            "      },\r\n" + 
            "      \"mkDetails\": [\r\n" + 
            "        {\r\n" + 
            "          \"Alpha\": \"D\",\r\n" + 
            "          \"Beta\": \"S\"\r\n" + 
            "        }\r\n" + 
            "      ],\r\n" + 
            "      \"mNetDetails\": [\r\n" + 
            "        {\r\n" + 
            "          \"Gaama\": \"213\",\r\n" + 
            "          \"mkTypeCode\": \"23\"\r\n" + 
            "        }\r\n" + 
            "      ]\r\n" + 
            "    }\r\n" + 
            "  ],\r\n" + 
            "  \"serviceFault\": {\r\n" + 
            "    \"faultType\": null,\r\n" + 
            "    \"faultCode\": null,\r\n" + 
            "    \"message\": null\r\n" + 
            "  }\r\n" + 
            "}";
     Gson gson = new Gson();

     JsonElement jelement = new JsonParser().parse(thisJson);
     JsonObject  jobject = jelement.getAsJsonObject();
     JsonArray jarray = jobject.getAsJsonArray("svc");
     jobject = jarray.get(0).getAsJsonObject();

     JsonArray netDetailsArr = jobject.getAsJsonArray("mNetDetails");
     JsonArray mkDetailsArr =  jobject.getAsJsonArray("mkDetails");

     jobject = netDetailsArr.get(0).getAsJsonObject();
     String gamma = jobject.get("Gaama").getAsString();
     System.out.println("gamma==>" + gamma);

     jobject = mkDetailsArr.get(0).getAsJsonObject();
     String alpha = jobject.get("Alpha").getAsString();
     String beta = jobject.get("Beta").getAsString();

     System.out.println("alpha ==>" + alpha);
     System.out.println("beta ===>"+ beta);

 }

вывод консоли:

gamma==>213
alpha ==>D
beta ===>S

Спасибо, работает хорошо. Интересно, есть ли способ проанализировать строку json из файла json.

Vamshi Verma 20.02.2019 07:54

Могу ли я узнать, как получить доступ к «Имени»: «Муравей», мне нужно преобразовать объект json в массив? :)

Vamshi Verma 20.02.2019 09:14

Другие вопросы по теме