【问题标题】:How to parse JSON String to java object with jackson?如何使用杰克逊将 JSON 字符串解析为 java 对象?
【发布时间】:2017-05-01 19:09:16
【问题描述】:

我目前在尝试将此 VCAP_SERVICES 解析为 java 对象时遇到问题。我不太明白如何构造 POJO 以允许它映射 json 字符串中的值。有人可以帮我构建我的 pojo 以使其与 json 字符串对齐吗?

我想为这两个凭据创建对象: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() + "!!!!!!!!!!!!!!!!!!!");

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

错误

无法识别的字段“用户提供”(类 rest.springframework.model.CupsProperties),未标记为可忽略(2 个已知属性:“jdbcUrl”、“dataSource”]) 在 [Source: {"user-provided":[{ "credentials": { "jdbcUrl": "jdbc:oracle:thin:user/pass//host:port/service", "spring.datasource.driver-class-名称”:“oracle.jdbc.OracleDriver”、“spring.datasource.initialize”:“假”}、“syslog_drain_url”:“”、“volume_mounts”:[]、“标签”:“用户提供”、“名称": "甲骨文", "标签": [] }]}; line: 1, column: 19](通过引用链:rest.springframework.model.CupsProperties["user-provided"])

【问题讨论】:

  • 您只想从 JSON 中解析某些字段或将整个 JSON 转换为镜像 Java 层次结构对象?
  • @yogidilip 我个人只是想从 json 中删除某些字段。我一直在尝试,并遵循指南。我只想要“凭据”中的值
  • 在这种情况下,您的 POJO 不必遵循特定的层次结构/结构。您可以手动解析JSON,只设置您感兴趣的字段。按照此示例解析examples.javacodegeeks.com/core-java/json/…
  • 谢谢!层次结构非常混乱。另一个问题。如果我添加另一个服务,我将有两个名为“凭据”的字段,这将如何工作?更新帖子。

标签: java json parsing


【解决方案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

【讨论】:

  • 由于某种原因没有显示访问令牌。不确定云代工厂日志是否混乱。 JDBC url 显示正确。
  • 检查您的输入日志以查看 accessToken 是否存在并且在正确的位置。
  • 知道了,这是云铸造日志。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多