2017-05-01 7 views
0

現在、このVCAP_SERVICESをjavaオブジェクトに解析する際に問題が発生しています。 POJOを構造化してjson文字列の値をマップできるようにする方法はよくわかりません。誰かが私のpojoを構造化してjsonの文字列と整列するのを助けてくれますか?jacksonを使ってJSON StringをJavaオブジェクトに解析する方法は?

両方の資格情報のオブジェクトを作成したいと思います。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クラス

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

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

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

のPOJO

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

認識できないフィールド "ユーザ提供"(クラスrest.springframework.model.CupsProperties)、無視としてマークされていない(2つの既知の特性: "jdbcUrlと"、 "データソース"])[ソースで :{ "ユーザ"{" "credentials":{"jdbcUrl": "jdbc:oracle:thin:user/pass // host:port/service"、 "spring.datasource.driver-class-name": "oracle.jdbc 「ユーザー」、「名前」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、「Oracle」、タグ ":[]}]};

+0

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

+0

あなただけのJSONのうちの特定のフィールドを解析またはJavaをミラーリングする全体JSONに変換したいです階層オブジェクト? – yogidilip

+0

@yogidilip私は個人的には、jsonから特定のフィールドを欲しいだけです。私は試してきたし、ガイドに従っている。私はちょうど "資格"の中の値を入れたい – Jesse

答えて

1

以下の解決策を確認し、必要が満たされているかどうかを確認してください(下記のリンクを参照してください)。より多くのフィールドを解析する必要がある場合は、それを基に構築できます。

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(); 
     } 

    } 

} 

出力

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

何らかの理由でアクセストークンが表示されません。クラウドのファウンドリがログを記録するかどうかは不明です。 JDBC URLが正しく表示されています。 – Jesse

+0

入力ログを確認してaccessTokenがあり、適切な場所にあることを確認してください。 – yogidilip

+0

それは、それは雲の鋳物のログだった。どうもありがとうございます – Jesse

関連する問題