2017-05-01 2 views
0

Ich habe derzeit Probleme beim Versuch, diese VCAP_SERVICES zu Java-Objekten zu parsen. Ich verstehe nicht ganz, wie man das POJO so strukturiert, dass es die Werte aus der JSON-Zeichenkette abbildet. Kann mir bitte jemand helfen, meine Pojo so zu strukturieren, dass sie mit der JSON-Zeichenfolge übereinstimmt?Wie analysiert man JSON String zu Java-Objekt mit Jackson?

Ich möchte Objekte für beide Anmeldeinformationen erstellen: accessToken ... jdbcurl.

VCAP_SERVICES

"VCAP_SERVICES": { 
     "user-provided": [ 
     { 
      "credentials": { 
      "accessTokenUri": "tokenurl", 
      "apiUrl": "apiurl", 
      "clientId": "typeofID", 
      "clientSecret": "secretAf", 
      "scope": "none" 
      }, 
      "syslog_drain_url": "", 
      "volume_mounts": [], 
      "label": "user-provided", 
      "name": "OAuth2", 
      "tags": [] 
     }, 
     { 
      "credentials": { 
      "jdbcUrl": "jdbc:oracle:connection[host]:[port]/service", 
      "spring.datasource.driver-class-name": "oracle.jdbc.OracleDriver", 
      "spring.datasource.initialize": "false" 
      }, 
      "syslog_drain_url": "", 
      "volume_mounts": [], 
      "label": "user-provided", 
      "name": "Database", 
      "tags": [] 
     } 
     ] 

Java Klasse

ObjectMapper mapper = new ObjectMapper(); 
     //json String to Object 

CupsProperties properties = mapper.readValue(VCAP_Services, CupsProperties.class); 

System.out.println(properties.getJdbcUrl() + "!!!!!!!!!!!!!!!!!!!"); 

POJOs

public class UserProviderWrapper { 

    @JsonProperty("user-provided") 
    public List<CupsProperties> cupsProperties; 
    @JsonProperty("syslog_drain_url") 
    public String syslog_drain_url; 
    @JsonProperty("volume_mounts") 
    public List<String> volume_mounts; 
    @JsonProperty("label") 
    public String label; 
    @JsonProperty("name") 
    public String name; 
    @JsonProperty("tags") 
    public List<String> tags; 
     //getters and setters 


public class CupsProperties { 

    @JsonProperty("jdbcUrl") 
    public String jdbcUrl; 
    @JsonProperty("spring.datasource.driver-class-name") 
    public String driver; 
    @JsonProperty("spring.datasource.initialize") 
    public String initialize; 
    //getters and setters 

Er ror

Unerkannte Feld "Benutzer bereitgestellte" (Klasse rest.springframework.model.CupsProperties), nicht als ignorable markiert (2 bekannten Eigenschaften: "jdbcUrl", "datasource"]) bei [Quelle: { "user -provided ": [{" credentials ": {" jdbcUrl ":" jdbc: oracle: thin: benutzer/pass // host: port/service "," spring.datasource.driver-klassenname ":" oracle.jdbc .OracleDriver "," spring.datasource.initialize ":" false "}," syslog_drain_url ":" "," volume_mounts ": []," label ":" benutzerdefiniert "," name ":" Oracle "," Stichworte": [ ] }]}; Zeile: 1, Spalte: 19] (über die Referenzkette: rest.springframework.model.CupsProperties ["user-provided"])

+0

JsonProperty: http://www.baeldung.com/jackson-annotations#highlighter_520754 –

+0

Sie nur bestimmte Felder aus dem JSON parsen wanna oder die ganze JSON konvertieren Java spiegeln Hierarchieobjekte? – yogidilip

+0

@yogidilip Ich persönlich möchte nur bestimmte Felder aus dem JSON. Ich habe versucht und folge Guides. Ich möchte nur die Werte in "Credentials" – Jesse

Antwort

1

Überprüfen Sie die unten stehende Lösung und prüfen Sie, ob sie Ihren Anforderungen entspricht. Sie können darauf aufbauen, wenn Sie mehr Felder analysieren müssen.

import java.util.Iterator; 

import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 
import org.json.simple.parser.JSONParser; 
import org.json.simple.parser.ParseException; 

public class JsonParser { 

    public static void main(String[] args) { 

     String VCAP_Services = "{\"userProvided\": [{\"credentials\": {\"accessTokenUri\": \"tokenurl\",\"apiUrl\": \"apiurl\",\"clientId\": \"typeofID\",\"clientSecret\": \"secretAf\",\"scope\": \"none\"},\"syslog_drain_url\": \"\",\"volume_mounts\": [],\"label\": \"user-provided\",\"name\": \"OAuth2\",\"tags\": []},{\"credentials\": {\"jdbcUrl\": \"jdbc:oracle:connection[host]:[port]/service\",\"spring.datasource.driver-class-name\": \"oracle.jdbc.OracleDriver\",\"spring.datasource.initialize\": \"false\"},\"syslog_drain_url\": \"\",\"volume_mounts\": [],\"label\": \"user-provided\",\"name\": \"Database\",\"tags\": [] } ] } "; 

     CupsProperties properties=null; 
     try { 

      JSONParser jsonParser = new JSONParser(); 
      JSONObject vcapServiceJSONObject = (JSONObject) jsonParser.parse(VCAP_Services); 

      for(Object key: vcapServiceJSONObject.keySet()){ 
       String keyStr = (String) key; 
       JSONArray userProvidedList = (JSONArray) vcapServiceJSONObject.get(keyStr); 

       Iterator i = userProvidedList.iterator(); 
       while (i.hasNext()) { 
        JSONObject innerObj = (JSONObject) i.next(); 
        JSONObject credentialsObject = (JSONObject) innerObj.get("credentials"); 
        if(credentialsObject.containsKey("jdbcUrl")){ 
         //set to your pojo objects 
         System.out.println("JDBC url:" + credentialsObject.get("jdbcUrl")); 
        } 

        if(credentialsObject.containsKey("accessTokenUri")){ 
         //set to your pojo objects 
         System.out.println("Access token URI:" + credentialsObject.get("accessTokenUri")); 
        } 
       } 
      } 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

Ausgabe

Access token URI:tokenurl 
JDBC url:jdbc:oracle:connection[host]:[port]/service 
+0

Aus irgendeinem Grund wird Access-Token nicht angezeigt. Nicht sicher, ob Cloud-Gießerei-Protokolle versagen JDBC-URL wird korrekt angezeigt. – Jesse

+0

Überprüfen Sie Ihre Eingabeaufzeichnungen, um zu sehen, dass accessToken da ist und sich an der richtigen Stelle befindet. – yogidilip

+0

Verstanden, es waren Cloud Foundry Logs. Ich danke dir sehr – Jesse

Verwandte Themen