【问题标题】:JSON and JacksonJSON 和杰克逊
【发布时间】:2012-10-30 17:56:41
【问题描述】:

如何让 Jackson 忽略 JSON 名称?

我有以下 POJO:

class MyPojo {
   private String ABCName;
}

当我有这样的东西时:

"ABCName" : "foo" ,然后 Jackson 无法识别它会引发错误。

它期望如下:

“abcName”:“foo”。

代码:

import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;

    public class TestJackson {

        public static void main(String args[]) throws Exception {

            ObjectMapper mapper = new ObjectMapper();
            MyPojo my = new MyPojo();
            my.setABCName("Foo");
            System.out.println(mapper.writeValueAsString(my));

        }

        private static class MyPojo {


            private String ABCName;
            public void setABCName(String ABCName) {
                this.ABCName = ABCName;
            }

            public String getABCName() {
                return ABCName;
            }
        }

    }

输出:{"abcname":"Foo"}

然后我尝试用 @JsonProperty("ABCName") 注释 ABCName

在我注释并运行代码后,我得到了:{"ABCName":"Foo","abcname":"Foo"}

导致重复。

我有一个 JSON 客户端,它将发送为:“ABCName”:“Foo”,我需要在 Jackson 中处理它。

有什么解决方法吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: json jackson


    【解决方案1】:

    你可以试试gensonhttp://code.google.com/p/genson/。以下代码应该会产生您期望的结果。

    String json = "{\"ABCName\" : \"foo\"}";
    MyPojo my = new MyPojo();
    my.setABCName("Foo");
    
    Genson genson = new Genson();
    System.out.println(genson.serialize(my));
    System.out.println(genson.deserialize(json, MyPojo.class).ABCName);
    
     public static class MyPojo {
         private String ABCName;
         public void setABCName(String ABCName) {
             this.ABCName = ABCName;
         }
    
         @JsonProperty("ABCName") public String getABCName() {
             return ABCName;
         }
     }
    

    【讨论】:

      【解决方案2】:

      实际上,以下内容适用于杰克逊本身:

      public class MyPojo {
           private String ABCName;
           public void setABCName(String ABCName) {
               this.ABCName = ABCName;
           }
      
           @JsonProperty("ABCName") 
      public String getABCName() {
               return ABCName;
           }
       }
      

      结果:{"ABCName":"Foo"}

      但是当您注释该字段时,它会导致重复,这意味着以下内容不起作用:

      public class MyPojo {
               @JsonProperty("ABCName") 
               private String ABCName;
               public void setABCName(String ABCName) {
                   this.ABCName = ABCName;
               }
      
      
          public String getABCName() {
                   return ABCName;
               }
           }
      

      结果:{"ABCName":"Foo","abcname":"Foo"}

      看起来注释必须在 getter 方法之上。

      非常感谢。

      【讨论】:

        【解决方案3】:

        你可以通过如下设置注解内省器来尝试jackson本身

        公共类 TestJackson {

            public static void main(String args[]) throws Exception {
        
                ObjectMapper mapper = new ObjectMapper();
                AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
                mapper.setAnnotationIntrospector(introspector);
                MyPojo my = new MyPojo();
                my.setABCName("Foo");
                System.out.println(mapper.writeValueAsString(my));
        
            }
        
            private static class MyPojo {
        
                @JsonProperty("ABCName")
                private String ABCName;
                public void setABCName(String ABCName) {
                    this.ABCName = ABCName;
                }
        
                public String getABCName() {
                    return ABCName;
                }
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2019-05-02
          • 2014-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多