Преобразование массива JSON в объект (вложенный JSON)

#java #arrays #json

#java #массивы #json

Вопрос:

У меня есть файл JSON, подобный этому —

 {
  "users": [
    {
      "displayName": "Amanda Polly",
      "givenName": "Amanda",
      "surname": "Polly",
      "extension_user_type": "user",
      "identities": [
        {
          "signInType": "emailAddress",
          "issuerAssignedId": "amandapolly@gmail.com"
        }
      ],
      "extension_timezone": "PST",
      "extension_locale": "en-US",
      "extension_tenant": "EG1234"
    },
    {
      "displayName": "Lowa Doe",
      "givenName": "Lowa",
      "surname": "Doe",
      "extension_user_type": "user",
      "identities": [
        {
          "signInType": "userName",
          "issuerAssignedId": "lowadow123"
        }
      ],
      "extension_timezone": "PST",
      "extension_locale": "en-US",
      "extension_tenant": "EG1234"
    }
   ]
}
  

Если вы видите, что внутри массива «пользователи» заключены 2 пользователя (Аманда и Лоуа).
Я проанализировал файл и преобразовал все это в одну строку.

Теперь я пытаюсь выполнить итерацию по всем полям, таким как DisplayName, GivenName, фамилия и так далее! но если вы видите, что идентификаторы снова являются оболочкой для «signInType» и «issuerAssignedId».

Я написал код, который выполняет итерации по всем пользователям, но я не могу получить поле «идентификаторы». Ниже приведен мой код:

Здесь параметром для JSONObject является jsonAsString (это моя строка с указанным выше JSON), теперь я создал JSONArray и передаю оболочку «users».

приведенный ниже код работает нормально, но может кто-нибудь, пожалуйста, помочь в повторении поля «идентификаторы» для каждого пользователя.

 JSONObject jsonObject = new JSONObject(jsonAsString);
org.json.JSONArray jsonArray = jsonObject.getJSONArray("users");

System.out.println(jsonArray.length());

for(int i = 0; i< jsonArray.length();i  )
{
        displayName = jsonArray.getJSONObject(i).getString("displayName");
        givenName = jsonArray.getJSONObject(i).getString("givenName");
        surname = jsonArray.getJSONObject(i).getString("surname");
        extension_user_type = jsonArray.getJSONObject(i).getString("extension_user_type");
        
        
        try
        {
            extension_timezone = jsonArray.getJSONObject(i).getString("extension_timezone");
            extension_locale = jsonArray.getJSONObject(i).getString("extension_locale");
            extension_tenant = jsonArray.getJSONObject(i).getString("extension_tenant");
        }
        catch(JSONException e)
        {
            System.out.println("nSome attribute was not found!");
        }
        
        System.out.println("ndisplayName : " displayName);
        System.out.println("ngivenName : " givenName);
        System.out.println("nsurname : " surname);
        System.out.println("nextension_user_type : " extension_user_type);
        System.out.println("nextension_timezone : " extension_timezone);
        System.out.println("nextension_locale : " extension_locale);
        System.out.println("nextension_tenant : " extension_tenant);
  

Комментарии:

1. Поместите свой JSON на этот сайт , чтобы преобразовать его в соответствующие классы данных C #, а затем просто используйте Root deserialized = JsonConvert.DeserializeObject(myJson); для десериализации всего этого

2. Можете ли вы предложить другой способ?

3. похоже на мое?

4. Я мог бы. Но предложенный мной способ намного проще.

5. На самом деле я хотел сделать это аналогичным образом, но из-за ограничений я не могу. Однако в следующий раз я обязательно буду использовать этот способ, поскольку это лучший подход

Ответ №1:

Используйте приведенный ниже код :

JSONObject JSONObject = новый JSONObject(jsonAsString); org.json.JSONArray JSONArray = JSONObject.getJSONArray («пользователи»);

 System.out.println(jsonArray.length());

for(int i = 0; i< jsonArray.length();i  )
{
        displayName = jsonArray.getJSONObject(i).getString("displayName");
        givenName = jsonArray.getJSONObject(i).getString("givenName");
        surname = jsonArray.getJSONObject(i).getString("surname");
        extension_user_type = jsonArray.getJSONObject(i).getString("extension_user_type");

        org.json.JSONArray jsonIdentitiesArray = jsonArray.getJSONObject(i).getJSONArray("identities");
        for(int j = 0; j< jsonIdentitiesArray.length();j  )
        {
            String signInType=jsonIdentitiesArray.getJSONObject(j).getString("signInType");
             System.out.println("signInType : " signInType);
            String issuerAssignedId=jsonIdentitiesArray.getJSONObject(j).getString("issuerAssignedId");
             System.out.println("issuerAssignedId : " issuerAssignedId);
        }
        
        try
        {
            extension_timezone = jsonArray.getJSONObject(i).getString("extension_timezone");
            extension_locale = jsonArray.getJSONObject(i).getString("extension_locale");
            extension_tenant = jsonArray.getJSONObject(i).getString("extension_tenant");
        }
        catch(JSONException e)
        {
            System.out.println("nSome attribute was not found!");
        }
        
        System.out.println("ndisplayName : " displayName);
        System.out.println("ngivenName : " givenName);
        System.out.println("nsurname : " surname);
        System.out.println("nextension_user_type : " extension_user_type);
        System.out.println("nextension_timezone : " extension_timezone);
        System.out.println("nextension_locale : " extension_locale);
        System.out.println("nextension_tenant : " extension_tenant);
  

Ответ №2:

я думаю, вы можете добиться этого, выполнив тот же процесс, что и с пользовательским json arr, для каждого пользователя используйте функцию get, чтобы получить массив identities json и повторить его для каждого пользователя.

JSONObject currentUserJsonObj = (JSONObject)JSONArray.getJSONObject(i);

JSONArray idnts=(JSONArray)(currentUserJsonObj.get(«идентификаторы»));