public InstanceInfo deserialize()

in eureka-client/src/main/java/com/netflix/discovery/converters/EurekaJacksonCodec.java [498:656]


        public InstanceInfo deserialize(JsonParser jp, DeserializationContext context) throws IOException {
            if (Thread.currentThread().isInterrupted()) {
                throw new JsonParseException(jp, "processing aborted");
            }
            DeserializerStringCache intern = DeserializerStringCache.from(context);
            InstanceInfo.Builder builder = InstanceInfo.Builder.newBuilder(self);
            JsonToken jsonToken;
            while ((jsonToken = jp.nextToken()) != JsonToken.END_OBJECT) {
                InstanceInfoField instanceInfoField = InstanceInfoField.lookup.find(jp);
                jsonToken = jp.nextToken();
                if (instanceInfoField != null && jsonToken != JsonToken.VALUE_NULL) {
                    switch(instanceInfoField) {
                    case HOSTNAME:
                        builder.setHostName(intern.apply(jp));
                        break;
                    case INSTANCE_ID:
                        builder.setInstanceId(intern.apply(jp));
                        break;
                    case APP:
                        builder.setAppNameForDeser(
                                intern.apply(jp, CacheScope.APPLICATION_SCOPE,
                                ()->{
                                    try {
                                        return jp.getText().toUpperCase();
                                    } catch (IOException e) {
                                        throw new RuntimeJsonMappingException(e.getMessage());
                                    }
                              }));
                        break;
                    case IP:
                        builder.setIPAddr(intern.apply(jp));
                        break;
                    case SID:
                        builder.setSID(intern.apply(jp, CacheScope.GLOBAL_SCOPE));
                        break;
                    case ID_ATTR:
                        // nothing
                        break;
                    case STATUS:
                        builder.setStatus(statusLookup.find(jp, InstanceStatus.UNKNOWN));
                        break;
                    case OVERRIDDEN_STATUS:
                        builder.setOverriddenStatus(statusLookup.find(jp, InstanceStatus.UNKNOWN));
                        break;
                    case OVERRIDDEN_STATUS_LEGACY:
                        builder.setOverriddenStatus(statusLookup.find(jp, InstanceStatus.UNKNOWN));
                        break;
                    case PORT:
                        while ((jsonToken = jp.nextToken()) != JsonToken.END_OBJECT) {
                            PortField field = PortField.lookup.find(jp);
                            switch(field) {
                            case PORT:
                                if (jsonToken == JsonToken.FIELD_NAME) jp.nextToken();
                                builder.setPort(jp.getValueAsInt());
                                break;
                            case ENABLED:                            
                                if (jsonToken == JsonToken.FIELD_NAME) jp.nextToken();
                                builder.enablePort(PortType.UNSECURE, jp.getValueAsBoolean());
                                break;
                            default:
                            }
                        }
                        break;
                    case SECURE_PORT:
                        while ((jsonToken = jp.nextToken()) != JsonToken.END_OBJECT) {
                            PortField field = PortField.lookup.find(jp);
                            switch(field) {
                            case PORT:
                                if (jsonToken == JsonToken.FIELD_NAME) jp.nextToken();
                                builder.setSecurePort(jp.getValueAsInt());
                                break;
                            case ENABLED:                            
                                if (jsonToken == JsonToken.FIELD_NAME) jp.nextToken();
                                builder.enablePort(PortType.SECURE, jp.getValueAsBoolean());
                                break;
                            default:
                            }
                        }
                        break;
                    case COUNTRY_ID:
                        builder.setCountryId(jp.getValueAsInt());
                        break;
                    case DATACENTER:
                        builder.setDataCenterInfo(DeserializerStringCache.init(mapper.readerFor(DataCenterInfo.class), context).readValue(jp));
                        break;
                    case LEASE:
                        builder.setLeaseInfo(mapper.readerFor(LeaseInfo.class).readValue(jp));
                        break;
                    case HEALTHCHECKURL:
                        builder.setHealthCheckUrlsForDeser(intern.apply(jp.getText()), null);
                        break;
                    case SECHEALTHCHECKURL:
                        builder.setHealthCheckUrlsForDeser(null, intern.apply(jp.getText()));
                        break;
                    case APPGROUPNAME:
                        builder.setAppGroupNameForDeser(intern.apply(jp, CacheScope.GLOBAL_SCOPE, 
                                ()->{
                                    try {
                                        return jp.getText().toUpperCase();
                                    } catch (IOException e) {
                                        throw new RuntimeJsonMappingException(e.getMessage());
                                    }
                              }));
                        break;
                    case HOMEPAGEURL:
                        builder.setHomePageUrlForDeser(intern.apply(jp.getText()));
                        break;
                    case STATUSPAGEURL:
                        builder.setStatusPageUrlForDeser(intern.apply(jp.getText()));
                        break;
                    case VIPADDRESS:
                        builder.setVIPAddressDeser(intern.apply(jp));
                        break;
                    case SECVIPADDRESS:
                        builder.setSecureVIPAddressDeser(intern.apply(jp));
                        break;
                    case ISCOORDINATINGDISCSERVER:
                        builder.setIsCoordinatingDiscoveryServer(jp.getValueAsBoolean());
                        break;
                    case LASTUPDATEDTS:
                        builder.setLastUpdatedTimestamp(jp.getValueAsLong());
                        break;
                    case LASTDIRTYTS:
                        builder.setLastDirtyTimestamp(jp.getValueAsLong());
                        break;
                    case ACTIONTYPE:
                        builder.setActionType(actionTypeLookup.find(jp.getTextCharacters(), jp.getTextOffset(), jp.getTextLength()));
                        break;
                    case ASGNAME:
                        builder.setASGName(intern.apply(jp));
                        break;
                    case METADATA:
                        Map<String, String> metadataMap = null;
                        while ((jsonToken = jp.nextToken()) != JsonToken.END_OBJECT) {
                            char[] parserChars = jp.getTextCharacters();
                            if (parserChars[0] == '@' && EnumLookup.equals(BUF_AT_CLASS, parserChars, jp.getTextOffset(), jp.getTextLength())) {
                                // skip this
                                jsonToken = jp.nextToken();
                            }
                            else { // For backwards compatibility
                                String key = intern.apply(jp, CacheScope.GLOBAL_SCOPE);
                                jsonToken = jp.nextToken();
                                String value = intern.apply(jp, CacheScope.APPLICATION_SCOPE );
                                metadataMap = Optional.ofNullable(metadataMap).orElseGet(METADATA_MAP_SUPPLIER);
                                metadataMap.put(key, value);
                            }
                        };   
                        builder.setMetadata(metadataMap == null ? Collections.emptyMap() : metadataMap);
                        break;
                    default:                    
                        autoUnmarshalEligible(jp.getCurrentName(), jp.getValueAsString(), builder.getRawInstance());
                    }
                }
                else {
                    autoUnmarshalEligible(jp.getCurrentName(), jp.getValueAsString(), builder.getRawInstance());
                }
            }
            return builder.build();
        }