美文网首页
Java智能JSON解析

Java智能JSON解析

作者: 大风车__ | 来源:发表于2020-07-15 16:04 被阅读0次
    GitHub:

    Java:https://github.com/QiaokeZ/Java_AnyObjectMapper
    Android:https://github.com/QiaokeZ/Android_AnyObjectMapper
    iOS:https://github.com/QiaokeZ/iOS_AnyObjectMapper

    前言

    项目中有很多JavaBean类,少则5-10个,多则10-20个,其中大部分的字段都重复了,并且有些字段名称一样但类型不一样,导致不能重用,为了解决这些问题,写了个智能JSON解析,一个JavaBean类替代所有的类。

    基本使用
    public class CPU {
        public String name;
        public String codeName;
        public String _package;
        public String technology;
        public String coreVID;
        public String coreSpeed;
        public String multiplier;
        public String busSpeed;
        public String ratedFSB;
        public Integer cores;
        public Integer threads;
        public Number price;
    }
    
    public void jsonToBean() {
         String json = "{\n" +
                 "            \"name\": \"Intel Core i9-9900K\",\n" +
                 "            \"codeName\": \"kaby Lake\",\n" +
                 "            \"package\": \"Socket 1151 LGA\",\n" +
                 "            \"technology\": \"14nm\",\n" +
                 "            \"coreVID\": \"0.944V\",\n" +
                 "            \"coreSpeed\": \"5000.00 MHz\",\n" +
                 "            \"multiplier\": \"x 50.0(8 - 50)\",\n" +
                 "            \"busSpeed\": \"100.00 MHz\",\n" +
                 "            \"ratedFSB\": \"\",\n" +
                 "            \"cores\": 8,\n" +
                 "            \"threads\": 16,\n" +
                 "            \"price\": 3949\n" +
                 "}";
    
         Map<String, String> decodeCodingkeys = new HashMap();
         decodeCodingkeys.put("_package", "package");
    
         Serializer serializer = new Serializer();
         serializer.setDecodeCodingkeys(decodeCodingkeys);
    
         try {
             CPU cpu = Mapper.decode(CPU.class, json, serializer);
             System.out.println(cpu.name); //Intel Core i9-9900K
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
    public static void jsonArrayToBean() {
        String json = "[\n" +
                "    {\n" +
                "        \"name\": \"Intel Core i5-9600K\",\n" +
                "        \"codeName\": \"kaby Lake\",\n" +
                "        \"package\": \"Socket 1151 LGA\",\n" +
                "        \"technology\": \"14nm\",\n" +
                "        \"coreVID\": \"0.944V\",\n" +
                "        \"coreSpeed\": \"5000.00 MHz\",\n" +
                "        \"multiplier\": \"x 50.0(8 - 50)\",\n" +
                "        \"busSpeed\": \"100.00 MHz\",\n" +
                "        \"ratedFSB\": \"\",\n" +
                "        \"cores\": 8,\n" +
                "        \"threads\": 16,\n" +
                "        \"price\": 1679\n" +
                "    },\n" +
                "    {\n" +
                "        \"name\": \"Intel Core i5-9600K\",\n" +
                "        \"codeName\": \"kaby Lake\",\n" +
                "        \"package\": \"Socket 1151 LGA\",\n" +
                "        \"technology\": \"14nm\",\n" +
                "        \"coreVID\": \"0.944V\",\n" +
                "        \"coreSpeed\": \"5000.00 MHz\",\n" +
                "        \"multiplier\": \"x 50.0(8 - 50)\",\n" +
                "        \"busSpeed\": \"100.00 MHz\",\n" +
                "        \"ratedFSB\": \"\",\n" +
                "        \"cores\": 8,\n" +
                "        \"threads\": 16,\n" +
                "        \"price\": 1679\n" +
                "    },\n" +
                "    {\n" +
                "        \"name\": \"Intel Core i5-9600K\",\n" +
                "        \"codeName\": \"kaby Lake\",\n" +
                "        \"package\": \"Socket 1151 LGA\",\n" +
                "        \"technology\": \"14nm\",\n" +
                "        \"coreVID\": \"0.944V\",\n" +
                "        \"coreSpeed\": \"5000.00 MHz\",\n" +
                "        \"multiplier\": \"x 50.0(8 - 50)\",\n" +
                "        \"busSpeed\": \"100.00 MHz\",\n" +
                "        \"ratedFSB\": \"\",\n" +
                "        \"cores\": 8,\n" +
                "        \"threads\": 16,\n" +
                "        \"price\": 1679\n" +
                "    },\n" +
                "    {\n" +
                "        \"name\": \"Intel Core i5-9600K\",\n" +
                "        \"codeName\": \"kaby Lake\",\n" +
                "        \"package\": \"Socket 1151 LGA\",\n" +
                "        \"technology\": \"14nm\",\n" +
                "        \"coreVID\": \"0.944V\",\n" +
                "        \"coreSpeed\": \"5000.00 MHz\",\n" +
                "        \"multiplier\": \"x 50.0(8 - 50)\",\n" +
                "        \"busSpeed\": \"100.00 MHz\",\n" +
                "        \"ratedFSB\": \"\",\n" +
                "        \"cores\": 8,\n" +
                "        \"threads\": 16,\n" +
                "        \"price\": 1679\n" +
                "    }\n" +
                "]";
    
        Map<String, String> decodeCodingkeys = new HashMap();
        decodeCodingkeys.put("_package", "package");
    
        Serializer serializer = new Serializer();
        serializer.setDecodeCodingkeys(decodeCodingkeys);
    
        try {
            List<CPU> cpus = Mapper.decode(CPU.class, json, serializer);
            CPU cpu = cpus.get(0);
            System.out.println(cpu.name); //Intel Core i5-9600K
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    高级使用
    //将JSON有可能出现的key全部放进来
    //不确定的类型用AnyObject
    public class PublicBean {
        public String price;
        public String version;
        public String name;
        public AnyObject ID;
        public AnyObject desc;
        public AnyObject cpu;
        public AnyObject memory;
        public AnyObject graphics;
        public AnyObject mainboard;
        public AnyObject radiator;
        public AnyObject hardDisk;
        public AnyObject networkAdapter;
        public AnyObject monitor;
        public AnyObject keyboard;
        public AnyObject mouse;
        public AnyObject systems;
        public AnyObject codeName;
        public AnyObject _package;
        public AnyObject technology;
        public AnyObject coreVID;
        public AnyObject coreSpeed;
        public AnyObject multiplier;
        public AnyObject busSpeed;
        public AnyObject ratedFSB;
        public AnyObject cores;
        public AnyObject threads;
        public AnyObject type;
        public AnyObject size;
        public AnyObject dramFrequency;
        public AnyObject gpu;
        public AnyObject coolingMode;
        public AnyObject series;
        public AnyObject model;
        public AnyObject _interface;
        public AnyObject resolution;
    }
    
    public static void testJSONToBean() {
         String json = json = "{\n" +
                 "    \"cpu\": {\n" +
                 "        \"name\": \"Intel Core i9-9900K\",\n" +
                 "        \"codeName\": \"kaby Lake\",\n" +
                 "        \"package\": \"Socket 1151 LGA\",\n" +
                 "        \"technology\": \"14nm\",\n" +
                 "        \"coreVID\": \"0.944V\",\n" +
                 "        \"coreSpeed\": \"5000.00 MHz\",\n" +
                 "        \"multiplier\": \"x 50.0(8 - 50)\",\n" +
                 "        \"busSpeed\": \"100.00 MHz\",\n" +
                 "        \"ratedFSB\": \"\",\n" +
                 "        \"cores\": 8,\n" +
                 "        \"threads\": 16,\n" +
                 "        \"price\": 3949\n" +
                 "    },\n" +
                 "    \"memory\": {\n" +
                 "        \"name\": \"金士顿(Kingston)\",\n" +
                 "        \"type\": \"288-Pin DDR4 UDIMM\",\n" +
                 "        \"size\": \"64GB\",\n" +
                 "        \"dramFrequency\": \"DDR4 3200\",\n" +
                 "        \"price\": 2499\n" +
                 "    },\n" +
                 "    \"graphics\": {\n" +
                 "        \"name\": \"蓝宝石 SAPPHIRE RX 5700 XT\",\n" +
                 "        \"gpu\": \"AMD\",\n" +
                 "        \"technology\": \"7nm\",\n" +
                 "        \"price\": 3199\n" +
                 "    },\n" +
                 "    \"mainboard\": {\n" +
                 "        \"name\": \"技嘉 GIGABYTE\",\n" +
                 "        \"type\": \"Intel平台\",\n" +
                 "        \"model\": \"Z390 GAMING X\",\n" +
                 "        \"price\": 1298\n" +
                 "    },\n" +
                 "    \"radiator\": {\n" +
                 "        \"name\": \"猫头鹰\",\n" +
                 "        \"coolingMode\": \"风冷\",\n" +
                 "        \"price\": 699\n" +
                 "    },\n" +
                 "    \"hardDisk\": {\n" +
                 "        \"name\": \"三星(SAMSUNG)\",\n" +
                 "        \"series\": \"970 EVO 系列\",\n" +
                 "        \"model\": \"MZ-V7E500BW\",\n" +
                 "        \"size\": \"1T\",\n" +
                 "        \"price\": 1399\n" +
                 "    },\n" +
                 "    \"networkAdapter\": {\n" +
                 "        \"name\": \"奋威(fenvi)FV-T919\",\n" +
                 "        \"type\": \"双频网卡\",\n" +
                 "        \"model\": \"FV-HB1200\",\n" +
                 "        \"interface\": \"PCI-E接口\",\n" +
                 "        \"price\": 238\n" +
                 "    },\n" +
                 "    \"monitor\": {\n" +
                 "        \"name\": \"戴尔 DELL\",\n" +
                 "        \"model\": \"U2720QM\",\n" +
                 "        \"resolution\": \"3850x2160\",\n" +
                 "        \"price\": 4199\n" +
                 "    },\n" +
                 "    \"keyboard\": {\n" +
                 "        \"name\": \"Apple\",\n" +
                 "        \"type\": \"无线键盘\",\n" +
                 "        \"price\": 699\n" +
                 "    },\n" +
                 "    \"mouse\": {\n" +
                 "        \"name\": \"Apple\",\n" +
                 "        \"type\": \"无线键盘\",\n" +
                 "        \"price\": 539\n" +
                 "    },\n" +
                 "    \"systems\": [\n" +
                 "        {\n" +
                 "            \"name\": \"macOS\",\n" +
                 "            \"version\": \"10.15.4\"\n" +
                 "        },\n" +
                 "        {\n" +
                 "            \"name\": \"windows8\",\n" +
                 "            \"version\": \"8\"\n" +
                 "        },\n" +
                 "        {\n" +
                 "            \"name\": \"windows10\",\n" +
                 "            \"version\": \"10\"\n" +
                 "        },\n" +
                 "        {\n" +
                 "            \"name\": \"CentOS\",\n" +
                 "            \"version\": \"6.5\"\n" +
                 "        },\n" +
                 "        {\n" +
                 "            \"name\": \"Ubuntu\",\n" +
                 "            \"version\": \"4.8.2\"\n" +
                 "        }\n" +
                 "    ],\n" +
                 "    \"name\": \"顶级硬件配置\",\n" +
                 "    \"id\": \"EB17AA00-51C4-55BC-B863-8040ADA8DJ46\",\n" +
                 "    \"desciption\": \"CPU:i9-9900K, 内存条:金士顿64GB, 显卡:蓝宝石RX5700XT\\n主板:技嘉Z390, 硬盘:三星970EVO 1T, 散热器:猫头鹰\"\n" +
                 "}";
    
         Map<String, String> decodeCodingkeys = new HashMap();
         decodeCodingkeys.put("_package", "package");
    
         Serializer serializer = new Serializer();
         serializer.setDecodeCodingkeys(decodeCodingkeys);
    
         try {
             //公共bean(PublicBean)的优缺点:
             //优点:整个项目只需要一个bean
             //缺点:取值时比较麻烦
             PublicBean publicBean = Mapper.decode(PublicBean.class, json, serializer);
             System.out.println(publicBean.name); //顶级硬件配置
             System.out.println(publicBean.cpu.get(PublicBean.class).name); //Intel Core i9-9900K
             System.out.println(publicBean.cpu.get(PublicBean.class).codeName.get(String.class)); //kaby Lake
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    

    相关文章

      网友评论

          本文标题:Java智能JSON解析

          本文链接:https://www.haomeiwen.com/subject/zltjhktx.html