现在有一个JSON字符串:{"aaa":[["bbb",1],["ccc",-1]]}因为中间的["bbb",1]没有办法映射成Bean,所以这样的JSON字符串如何用Jackson解析?最好用Data-bind的方式解析,用JSON Tree的方式已经了解了。JavaJacksonJSON

解决方案 »

  1.   

    好了,已经自行解决这个问题了。现在放出可行的代码Bean A设计:public class A{
        private ArrayList<B> aaa;
        public ArrayList<B> getAaa(){
            return aaa;
        }
        public void setAaa(ArrayList<B> aaa){
            this.aaa=aaa;
        }
    }
    Bean B设计:public class B{
        private String str;
        private Integer ind;    // 标记使Jackson使用构造函数建立B对象而不是setter
        @JsonCreator
        public B(ArrayList<Object> bArr){
            if(bArr.get(0) instanceof String){
                this.str=(String)bArr.get(0);
            }
            if(bArr.get(1) instanceof Integer){
                this.ind=(Integer)bArr.get(1);
            }
        }
        public String getStr(){
            return this.str;
        }
        public void setStr(String str){
            this.str=str;
        }
        public Integer getInd(){
            return this.ind;
        }
        public void setInd(Integer ind){
            this.ind=ind;
        }
        // 标记使Jackson使用该方法获得对象用于串行化的值
        // 标记后,Jackson忽略以上getter
        @JsonValue(value=true)
        public ArrayList<Object> getB(){
            return new ArrayList<Object>(){
                {
                    add(getStr());
                    add(getInd());
                 }
            };
        }
    }
    主程序片段:// 读入解析
    ObjectMapper objMapper=new ObjectMapper();
    ArrayList<A> as=objMapper.readValue(jsonString,new TypeReference<ArrayList<A>>(){});
    // 输出
    objMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
    ObjectWriter ow=objectMapper.writer(new DefaultPrettyPrinter());
    String outJsonString=ow.writeValueAsString(as);
    Jackson的Annotation很多地方都没有提及,用Annotation配合Data-Bind解析Json很方便。
      

  2.   

    建议ArrayList声明的时候,声明为List,实例化的时候再使用ArrayList。
    算是一个好的习惯吧~
      

  3.   

    嗯,算是个好习惯,不过Jackson里已经指定会把数组解析为ArrayList了,所以可以限定更小一些。