博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中json的使用和解析
阅读量:6975 次
发布时间:2019-06-27

本文共 11302 字,大约阅读时间需要 37 分钟。

1.创建json对象

1.1 创建JSONObject对象

使用map初始化json

@Test    public void test1()     {            Map
map = new LinkedHashMap
(); map.put("name", "孙笑川"); map.put("age", 25); map.put("height", 1.70); map.put("major", new String[] { "理发", "挖掘机" }); map.put("hasGirlFriend", false); map.put("car", null); map.put("house", null); //null作为value时,转换成json后不会保存 JSONObject json1 = new JSONObject(map); System.out.println(json1.toString()); Map map2 = json1.toMap(); System.out.println(map2.toString()); }

 

可以看到,当value为null时,转化为json后不会保存,会直接抛弃。

  

使用javabean初始化json

//javaBeanclass Person {    public String name;    public int age;    public String idCard;         //省略getter&setter                }    //使用javaBean初始化json    @Test    public void test2()     {        Person person = new Person();        person.setName("孙亚龙");        person.setAge(30);        person.setIdCard("512445546565164641212");                JSONObject json2 = new JSONObject(person);                System.out.println(json2.toString());    }

 

直接创建JSONObject 

@Test    public void test3()     {        JSONObject json3 = new JSONObject();        Object nullObj = null;                json3.put("name", "孙悟空");        json3.put("changeTimes", 72);        json3.put("name", "MonkeySun"); //put方法:value保留原格式,若key相等,value会覆盖原值        json3.put("isHuman", false);                     json3.append("nickName", "齐天大圣"); //append方法:value存放在数组中,若key相等,value会覆盖原值        json3.append("nickName", "弼马温");                json3.accumulate("Teacher", "元始天尊"); //accmulate方法,和append方法一样        json3.accumulate("Teacher", "唐三藏");                        System.out.println(json3.toString());    }

 

1.2 创建JSONArray对象

直接从字符串获取:

  用给定的字符串初始化JSONArray对象,字符串最外层必须为中括号包裹:

@Test    public void test12()     {        String jsonString = "['white','卢本伟','芦苇','卢姥爷']";                JSONArray jsonArray = new JSONArray(jsonString);        for (Object object : jsonArray) {            System.out.println(object);        }    }

 

 

直接创建JSONArray对象:

  创建一个空的JSONArray对象,使用put传值

@Test    public void test_1()     {        JSONArray jsonArray = new JSONArray();        //1.put(value)方法         jsonArray.put("孙悟空");        //2.put(index value)方法        jsonArray.put(1,"{'变化':72,'武器',金箍棒}");                System.out.println(jsonArray);    }

 

2.解析json

2.1 官方json包解析

  使用官方json包解析时,需要下载json官方jar包,并导入

  下载地址(maven仓库):

  导入jar包:

import org.json.JSONArray;import org.json.JSONObject;
  • 待解析的字符串是简单对象类型,大括号 { }包围时:
    @Test    public void test6()     {        //待解析的json字符串        String jsonString = "{'name':'卢本伟','age':24,'Position':'Mid'}";                //因为json字符串是大括号包围,所以用JSONObject解析        JSONObject json = new JSONObject(jsonString);            String name = json.getString("name");        int age = json.getInt("age");        String position = json.getString("Position");        System.out.println("姓名:"+name);        System.out.println("年龄:"+age);        System.out.println("位置"+position);                    }

  • 待解析的字符串是数组类型,被中括号 [  ]  包围时:
@Test    public void test7()     {        //待解析的json字符串        String jsonString = "['卢本伟','white','卢伟','五五开']";                //因为json字符串是大括号包围,所以用JSONArray解析        JSONArray jsonArray = new JSONArray(jsonString);                //遍历即可,foreach或for循环        for (Object name : jsonArray) {            System.out.println(name);        }    }

  • 待解析的字符串既有中括号 [  ]、又有大括号[  ] 包围时,逐层解析
@Test    public void test5()     {        //待解析的json字符串        String jsonString = "{'name':'卢本伟','age':24,'Hero':{'name':'Fizz','Position':'Mid','charactor':'killer'},'nickNames':['五五开','芦苇','white'],'Honors':[{'year':2011,'name':'TGA总决赛冠军'},{'year':2013,'name':'S3全球总决赛中国区冠军'},{'year':2013,'name':'S3全球总决赛亚军'}]}";                try {        //因为json字符串是大括号包围,所以用JSONObject解析        JSONObject json = new JSONObject(jsonString);                /*         * 普通元素,根据类型直接获取         */        String name = json.getString("name");        int age = json.getInt("age");        System.out.println("姓名:"+name);        System.out.println("年龄:"+age);        System.out.println("————————————————————————————————");                /*         * 属性大括号包括,先获取JSONObject对象         */        JSONObject hero = json.getJSONObject("Hero");        String hero_name = hero.getString("name");        String hero_position = hero.getString("Position");        String hero_charactor = hero.getString("charactor");        System.out.println("擅长英雄:");        System.out.println("英雄名:"+hero_name);        System.out.println("位置:"+hero_position);        System.out.println("英雄定位:"+hero_charactor);        System.out.println("————————————————————————————————");                /*         * 属性被中括号包括,获取JSONArray对象,遍历即可         */        System.out.println("外号:");        JSONArray nickNames = json.getJSONArray("nickNames");        for (Object nickName : nickNames) {            System.out.println(nickName);        }        System.out.println("————————————————————————————————");                /*         * 属性中既有中括号包括,又嵌套了大括号,一层层获取即可         */        JSONArray Honors = json.getJSONArray("Honors");        System.out.println("所获荣誉:");        for(int i=0;i

2.2 fastjson解析

fastjson是阿里巴巴开源产品之一,解析速度快。

下载地址(maven仓库):

  • JSON字符串是简单对象类型,被大括号包围:

 当待解析的JSON字符串是简单对象类型的,即用大括号包围,此时采用JSONObject对象来处理:

@Test    public void test3()     {        //简单对象类型        String jsonStr = "{'name':'Misaya','position':'Mid','hero':':Twisted Fate'}";                JSONObject json = JSON.parseObject(jsonStr);        String name = json.getString("name");        System.out.println(name);                System.out.println(json);    }

 

 

 

  • JSON字符串是数组类型,被中括号包围

当待解析的JSON字符串是简单数组类型的,即用中括号包围,此时采用JSONArray对象来处理:

@Test    public void test4()     {        //数组类型        String jsonStr = "['元旦','五一','国庆','春节']";                JSONArray json = JSON.parseArray(jsonStr);        String first = (String) json.get(0);                System.out.println(first);        System.out.println(json);    }

 

  • JSON字符串为混合类型,既有简单对象,又有数组,逐层解析
@Test    public void test5()     {        //混合类型        String jsonStr = "[{'name':'元旦','vacation':'3'},{'name':'五一','vacation':'7'},{'name':'国庆','vacation':'7'}]";                JSONArray jsonArr = JSON.parseArray(jsonStr);                JSONObject jsonObj1 = jsonArr.getJSONObject(0);        System.out.println(jsonObj1);    }

 

  • JSON字符串有对应的类时,对象的解析:
1 /** 2  * @Author {LearnAndGet} 3  * @Time 2018年11月24日 4  * @Discription: 5  */ 6 import java.util.Arrays; 7 import java.util.HashMap; 8  9 public class Player {10     private String name;11     private int age;12     private HashMap Hero = new HashMap
();13 private String[] nickNames;14 private Honor[] Honors;15 16 public String getName() {17 return name;18 }19 20 public void setName(String name) {21 this.name = name;22 }23 24 public int getAge() {25 return age;26 }27 28 public void setAge(int age) {29 this.age = age;30 }31 32 public HashMap getHero() {33 return Hero;34 }35 36 public void setHero(HashMap hero) {37 Hero = hero;38 }39 40 public String[] getNickNames() {41 return nickNames;42 }43 44 public void setNickNames(String[] nickNames) {45 this.nickNames = nickNames;46 }47 48 public Honor[] getHonors() {49 return Honors;50 }51 52 public void setHonors(Honor[] honors) {53 Honors = honors;54 }55 56 57 @Override58 public String toString() {59 return "Player [name=" + name + ", age=" + age + ", Hero=" + Hero + ", nickNames=" + Arrays.toString(nickNames)60 + ", Honors=" + Arrays.toString(Honors) + "]";61 }62 63 64 static class Honor65 {66 int year;67 String name;68 public int getYear() {69 return year;70 }71 public void setYear(int year) {72 this.year = year;73 }74 public String getName() {75 return name;76 }77 public void setName(String name) {78 this.name = name;79 }80 @Override81 public String toString() {82 return "Honor [year=" + year + ", name=" + name + "]";83 }84 }85 86 87 }
View Code

 

@Test    public void Json2Obj()     {        //待解析的json字符串        String jsonString = "{'name':'卢本伟','age':24,'Hero':{'name':'Fizz','Position':'Mid','charactor':'killer'},'nickNames':['五五开','芦苇','white'],'Honors':[{'year':2011,'name':'TGA总决赛冠军'},{'year':2013,'name':'S3全球总决赛中国区冠军'},{'year':2013,'name':'S3全球总决赛亚军'}]}";                Player p = JSON.parseObject(jsonString, Player.class);                System.out.println(p);            }

2.3 jackson解析

  • 解析普通属性
    @Test    public void getCustomProp()     {        String jsonStr = "{\"price\":5000,\"count\":100,\"function\":[{\"name\":\"camera\",\"config\":1500},{\"name\":\"music\",\"config\":2000}]}";                try         {            ObjectMapper objMap = new ObjectMapper();                        JsonNode root = objMap.readTree(jsonStr);                        //在根节点上的属性            int price = root.path("price").asInt();            int count = root.path("count").asInt();            System.out.println("price"+":"+price);            System.out.println("count"+":"+count);                        //在叶子节点上的属性            JsonNode node = root.path("function");            String    fun1_name = node.path(0).path("name").asText();            int fun1_config = node.path(0).path("config").asInt();            System.out.println("function1:"+fun1_name+":"+fun1_config);                        String    fun2_name = node.path(1).path("name").asText();            int fun2_config = node.path(1).path("config").asInt();            System.out.println("function2:"+fun2_name+":"+fun2_config);                    }catch(Exception ex)         {            System.out.println(ex.getMessage());        }    }

     

  • 解析对象字符串
    //省略javaBean:Person的代码   @Test    public void json2obj()     {        String jsonStr = "{\"name\":\"二狗\",\"age\":15,\"idCard\":\"42125\"}";        try         {            ObjectMapper objMapper = new ObjectMapper();            //当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能            objMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);            Person p = objMapper.readValue(jsonStr, Person.class);            System.out.println(p);            }catch(Exception e)         {            System.out.println(e.getMessage());        }    }

     

      
  • 解析对象数组构成的字符串
    //省略 javaBean:Person代码 /*     * 解析对象数组构成的String     */    @Test    public  void jackSonTest()    {    String jsonStr = "[{\"name\":\"二狗\",\"age\":15,\"idCard\":\"42125\"},{\"name\":\"铁柱\",\"age\":12,\"idCard\":\"46521\"}]";    try     {        ObjectMapper mapper = new ObjectMapper();          TreeNode  treeNode = mapper.readTree(jsonStr);                List
    persons = mapper.readValue(jsonStr, new TypeReference
    >(){}); for (Person person : persons) { System.out.println(person); } }catch(Exception e) { System.out.println(e.getMessage()); } }

     

转载于:https://www.cnblogs.com/LearnAndGet/p/10009646.html

你可能感兴趣的文章
spring boot 项目中hanlp的配置(可增加自定义词典)
查看>>
结对项目-数独程序扩展
查看>>
系统windows版本修改
查看>>
android 多进程
查看>>
ubuntu “无法获得锁 /var/lib/dpkg/lock -open”
查看>>
大家好,我是小组成员刘俊伟
查看>>
Daily Scrum: 2012/11/2
查看>>
订单页过滤,sql写法
查看>>
H3C:下一代互联网的安全起点
查看>>
【常用】source insight常用设置及快捷键
查看>>
AD走圆弧走线
查看>>
PHP获取Linux当前目录下文件并实现下载功能
查看>>
python-操作hive
查看>>
(Spring4 json入门)Spring4+SpringMVC+页面数据发送与接收(json格式)
查看>>
852. Peak Index in a Mountain Array
查看>>
Vijos P1114 FBI树【DFS模拟,二叉树入门】
查看>>
Web版简易五子棋
查看>>
set集合
查看>>
sersync实时同步
查看>>
修改Http消息的消息头Host
查看>>