code: private void parseUserIdentity(CloudTrailEventData eventData) throws IOException {
          JsonToken nextToken = jsonParser.nextToken();
          if (nextToken == JsonToken.VALUE_NULL) {
              eventData.add(CloudTrailEventField.userIdentity.name(), null);
              return;
          }
  
          if (nextToken != JsonToken.START_OBJECT) {
              throw new JsonParseException("Not a UserIdentity object", jsonParser.getCurrentLocation());
          }
  
          UserIdentity userIdentity = new UserIdentity();
  
          while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
              String key = jsonParser.getCurrentName();
  
              switch (key) {
              case "type":
                  userIdentity.add(CloudTrailEventField.type.name(), jsonParser.nextTextValue());
                  break;
              case "principalId":
                  userIdentity.add(CloudTrailEventField.principalId.name(), jsonParser.nextTextValue());
                  break;
              case "arn":
                  userIdentity.add(CloudTrailEventField.arn.name(), jsonParser.nextTextValue());
                  break;
              case "accountId":
                  userIdentity.add(CloudTrailEventField.accountId.name(), jsonParser.nextTextValue());
                  break;
              case "accessKeyId":
                  userIdentity.add(CloudTrailEventField.accessKeyId.name(), jsonParser.nextTextValue());
                  break;
              case "userName":
                  userIdentity.add(CloudTrailEventField.userName.name(), jsonParser.nextTextValue());
                  break;
              case "sessionContext":
                  this.parseSessionContext(userIdentity);
                  break;
              case "invokedBy":
                  userIdentity.add(CloudTrailEventField.invokedBy.name(), jsonParser.nextTextValue());
                  break;
              case "identityProvider":
                  userIdentity.add(CloudTrailEventField.identityProvider.name(), jsonParser.nextTextValue());
                  break;
              default:
                  userIdentity.add(key, parseDefaultValue(key));
                  break;
              }
          }
          eventData.add(CloudTrailEventField.userIdentity.name(), userIdentity);
      }
docs: Parses the {@link UserIdentity} in CloudTrailEventData
  
  @param eventData {@link CloudTrailEventData} needs to parse.
  @throws IOException