【问题标题】:Issues when reading JSON values from POJO with ObjectMapper使用 ObjectMapper 从 POJO 读取 JSON 值时的问题
【发布时间】:2017-10-28 01:15:14
【问题描述】:

我想将 JSON 字符串解析为 POJO 类,但出现错误。

并且 我们可以从java中的方法返回两个值吗

字符串数据

String PostcreatedMessage = "..."; // see JSON value below
{
    "home_page":"/desk",
    "message":"Logged In",
    "full_name":"Shoaib Shaikh"
}

Main.class

LoginR loginR=new LoginR();

ObjectMapper mapper=new ObjectMapper();

loginR=mapper.readValue(PostcreatedMessage,LoginR.class);
System.out.println(loginR.getHomePage());
System.out.println(loginR.getMessage());
System.out.println(loginR.getFullName());

parsejacker.class

public class parsejacker
 {

    LoginR loginR=null;
    String jsonurl; 

    public parsejacker(String jsonurl) {
        super();
        this.jsonurl = jsonurl;
    }

        public void ParseLogin() throws JsonParseException,JsonMappingException,IOException
        {
                System.out.println(jsonurl+"this parselogin");
                ObjectMapper mapper=new ObjectMapper();
                loginR=mapper.readValue(jsonurl,LoginR.class);
                System.out.println(loginR.getHomePage());
                System.out.println(loginR.getMessage());
                System.out.println(loginR.getFullName());

        }
 }

LoginR.class

  public class LoginR

  {
      private String homePage; 
      private String message; 
      private String fullName; 

          public String getHomePage(){
            return homePage; 
          }
          public void setHomePage(String input){
             this.homePage = input;
          }
          public String getMessage(){
            return message; 
          }
          public void setMessage(String input){
             this.message = input;
          }
          public String getFullName(){
            return fullName; 
          }
          public void setFullName(String input){
             this.fullName = input;
         }
 }

我遇到了这些错误。

(我认为错误在PostcreatedMessage 字符串中。 如何克服"home_page":"/desk"? --> 这个反斜杠错误,即分隔或忽略这个字符)

   Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException:

    Unrecognized field "home_page" (Class org.greenshoaib.greenshaikh.login.model.LoginR), not marked as ignorable

at [Source: java.io.StringReader@4738a206; line: 1, column: 15] 

   (through reference chain: org.greenshoaib.greenshaikh.login.model.LoginR["home_page"])

    at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
    at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
    at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
    at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)
    at org.codehaus.jackson.map.deser.BeanDeserializer._handleUnknown(BeanDeserializer.java:725)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:703)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)
    at org.greenshoaib.greenshaikh.rest.client.RestAPIClient.main(RestAPIClient.java:72       )  

【问题讨论】:

  • 在旁注中,您应该改进您的编码风格,例如你的变量命名。 PostcreatedMessage 看起来像一个类名,但可能是一个变量名——这就是为什么 Java 代码约定规定只有类名应该以大写字母开头的驼峰式书写。

标签: java json string jackson


【解决方案1】:

问题是您的 JSON 包含一个字段“home_page”,但在您的 pojo 中它被称为homePage(与“full_name”相同)。杰克逊不知道两者是平等的,所以你需要帮助它,例如通过将@JsonProperty("home_page") 添加到homePage,即像这样(记得对fullName 做同样的事情):

@JsonProperty("home_page")
private String homePage; 

【讨论】:

    【解决方案2】:

    使用以下 json 字符串尝试您的方法:

    PostcreatedMessage {
        "homePage":"/desk",
        "message":"Logged In",
        "fullName":"Shoaib Shaikh"
    }
    

    【讨论】:

    • 虽然这可行,但开发人员通常无权更改有效负载,因为它通常带有一种合同形式。请参阅使用注释装饰模型 POJO 的其他答案,这允许保持有效负载不变,但在模型中使用适当的 Java 变量命名。
    • 我知道,但那是为了检查问题是否来自这里。正如你所说,真正的解决方案是添加@JsonProperty注解。
    【解决方案3】:

    您的问题是 ObjectMapper 无法通过名称识别您的 LoginR 类的属性,例如homePage != home_page.

    您可以注释这些属性以匹配其预期的 JSON 密钥。

    这是一个最小的例子:

    public class LoginR {
        @JsonProperty(value="home_page")
        private String homePage;
        @JsonProperty(value="full_name")
        private String fullName;
        // etc. the rest of your POJO
    }
    

    ...其他地方...

    String json = "{\"home_page\":\"/desk\",\"message\":\"Logged In\",\"full_name\":\"Shoaib Shaikh\"}";
    ObjectMapper mapper=new ObjectMapper();
    LoginR loginR = mapper.readValue(json,LoginR.class);
    System.out.println(loginR.getHomePage());
    System.out.println(loginR.getMessage());
    System.out.println(loginR.getFullName());
    

    输出

    /desk
    Logged In
    Shoaib Shaikh
    

    【讨论】:

    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多