Java 多层嵌套JSON类型数据全面解析

作者:简单随风 时间:2022-07-18 05:13:05 

多层嵌套JSON类型数据解析

简单来说:

“key”:“value” --> 此时value为String
“key":0 --> 此时value为int
“key”:{“k1”:“v1”} --> 此时value为JSONObject
“key”:[v] --> 此时value为JSONArray

以下举例数据结构

{
   "error": 0,
   "status": "success",
   "results": [
       {
           "currentCity": "青岛",
           "index": [
               {
                   "title": "穿衣",
                   "zs": "较冷",
                   "tipt": "穿衣指数",
                   "des": "建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。"
               },
               {
                   "title": "紫外线强度",
                   "zs": "中等",
                   "tipt": "紫外线强度指数",
                   "des": "属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。"
               }
           ]
       }
   ]
}

解析代码

public class Test {
public static void main(String[] args) {
   String s = "{\"error\":0,\"status\":\"success\",\"results\":[{\"currentCity\":\"青岛\",\"index\":[{\"title\":\"穿衣\",\"zs\":\"较冷\",\"tipt\":\"穿衣指数\",\"des\":\"建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。\"},{\"title\":\"紫外线强度\",\"zs\":\"最弱\",\"tipt\":\"紫外线强度指数\",\"des\":\"属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。\"}],}]}";
   JSONObject jsonObject = JSONObject.fromObject(s);
   //提取出error为 0
   int error = jsonObject.getInt("error");
   System.out.println("error:" + error);
   //提取出status为 success
   String status = jsonObject.getString("status");
   System.out.println("status:" + status);    
   //注意:results中的内容带有中括号[],所以要转化为JSONArray类型的对象
   JSONArray result = jsonObject.getJSONArray("results");
   for (int i = 0; i < result.size(); i++) {
       //提取出currentCity为 青岛
       String currentCity = result.getJSONObject(i).getString("currentCity");
       System.out.println("currentCity:" + currentCity);
       //注意:index中的内容带有中括号[],所以要转化为JSONArray类型的对象
       JSONArray index = result.getJSONObject(i).getJSONArray("index");
       for (int j = 0; j < index.size(); j++) {
           String title = index.getJSONObject(j).getString("title");
           System.out.println("title:" + title);
           String zs = index.getJSONObject(j).getString("zs");
           System.out.println("zs:" + zs);
           String tipt = index.getJSONObject(j).getString("tipt");
           System.out.println("tipt:" + tipt);
           String des = index.getJSONObject(j).getString("des");
           System.out.println("des:" + des);
       }
   }
}
}

json解析多层嵌套并转为对应类(List)

Json(随便扒的格式,将就看~)

{
   "code": 1,
   "message": "查询成功",
   "data": [
       {
           "type": 1,
           "question": "地层压力与同井深的淡水静液压力之比称为地层的()。",
           "answer": "1",
           "id": 1,
           "description": "题目描述",
           "answers": [
               {
                   "isCorrect": "1",
                   "answer_name": "A的选项内容"
               },
               {
                   "isCorrect": "0",
                   "answer_name": "B的选项内容"
               },
               {
                   "isCorrect": 0,
                   "answer_name": "C的选项内容"
               },
               {
                   "isCorect": "0",
                   "answer_name": "D的选项内容"
               }
           ]
       },
       {
           "type": 1,
           "question": "起钻时,产生的抽吸压力导致井底压力()。",
           "answer": "1",
           "id": 1,
           "description": "题目描述",
           "answers": [
               {
                   "isCorrect": 1,
                   "answer_name": "A的选项内容"
               },
               {
                   "isCorrect": 0,
                   "answer_name": "B的选项内容"
               },
               {
                   "isCorrect": 0,
                   "answer_name": "C的选项内容"
               },
               {
                   "isCorrect": 0,
                   "answer_name": "D的选项内容"
               }
           ]
       }
   ]
}

关键依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.72</version>
       </dependency>
JSONObject param = testDate();
       JSONObject param1 = testHeader("QUERY");
       String rDate = HealthServerHandler.getInstance().post(url,param1.toJSONString(), param.toJSONString());
       //这个依赖是com.google.code.gson;因为报错原因未知(报错下面图中显示),更换了阿里的依赖
       //RecOrder<ResultValue<PurchaseOrder, PageInfo>> recOrder = new Gson().fromJson(rDate, RecOrder.class);
       //处理json将类填充,入库
       JSONObject rDateJSON = JSONObject.parseObject(rDate);
       //这里获取的是"resultValue"标签下面“data”这个JSONArray
       JSONArray data = rDateJSON.getJSONObject("resultValue").getJSONArray("data");
       //这里获取的是"resultValue"标签下面“pageInfo”这个JSONObject
       JSONObject pageInfo = rDateJSON.getJSONObject("resultValue").getJSONObject("pageInfo");
       //PurchaseOrder 是具体接收类
       List<PurchaseOrder> purchaseOrder = JSONArray.parseArray(data.toString(),PurchaseOrder.class);
       PageInfo pageInfo1 = JSONObject.parseObject(pageInfo.toString(),PageInfo.class);
       //茵PageInfo与PurchaseOrder并不在同一结构内,需要二次添加
       for (PurchaseOrder order : purchaseOrder) {
           order.setPageCount(pageInfo1.getPageCount());
           order.setPageNum(pageInfo1.getPageNum());
           order.setTotal(pageInfo1.getTotal());
           order.setPageSize(pageInfo1.getPageSize());
           service.saveOrder(order);
       }

Java 多层嵌套JSON类型数据全面解析


package jansonDemo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class TestJSON {
   /**
    * JSON实际上也是键值对("key":"value")
    * key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
    * value如果是字符串,用jsonobj.getString("key")获取
    * value如果是数  字,用jsonobj.getIntValue("key"),jsonobj.getFloatValue("key"),jsonobj.getInteger("key")等基本数据类型及其包装类的方法获取
    * value如果是布尔值,用jsonobj.getBoolean("key"),jsonobj.getBooleanValue("key")获取
    * value如果是数  组,用jsonobj.getJSONArray("key")获取
    * value如果是Object对象,用jsonobj.get("key"),获取
    * value如果是JSONObject对象,用jsonobj.getJSONObject("key")获取
    */
   /**
    * 该方法用于将已有的json字符串转换为json对象,并取出该对象中相应的key对应的value值
    * 将已有的字符串转换成jsonobject,用JSON.parseObject(jsonStr)方法
    * json中只要是{}就代表一个JSONObject,[]就代表一个JSONArray
    * 获取JSONObject对象用JSONObject jsonobject.getJSONObject("key")方法
    * 获取JSONArray对象用JSONObject jsonobject.getJSONArray("key")方法
    */
   private static void strWritedToJSONObject() {
       //以下是一个json对象中嵌套一个json子对象
       String myJsonObj = "{\n" +
               "    \"name\":\"runoob\",\n" +
               "    \"alexa\":10000,\n" +
               "    \"sites\": {\n" +
               "        \"site1\":\"www.runoob.com\",\n" +
               "        \"site2\":\"m.runoob.com\",\n" +
               "        \"site3\":\"c.runoob.com\"\n" +
               "    }\n" +
               "}";
       JSONObject jsonobj = JSON.parseObject(myJsonObj); //将json字符串转换成jsonObject对象
       /***获取JSONObject中每个key对应的value值时,可以根据实际场景中想得到什么类型就分别运用不到的方法***/
       System.out.println(jsonobj.get("name")); //取出name对应的value值,得到的是一个object
       System.out.println(jsonobj.getString("name")); //取出name对应的value值,得到的是一个String
       System.out.println(jsonobj.getIntValue("alexa")); //取出name对应的value值,得到的是一个int
       System.out.println(jsonobj.get("sites")); //取出sites对应的value值,得到的是一个object
       System.out.println(jsonobj.getString("sites"));
       System.out.println(jsonobj.getJSONObject("sites")); //取出sites对应的value值,得到一个JSONObject子对象
       System.out.println(jsonobj.getJSONObject("sites").getString("site2")); //取出嵌套的JSONObject子对象中site2对应的value值,必须用getJSONObject()先获取JSONObject
       /**
        * 以下是一个json对象中包含数组,数组中又包含json子对象和子数组
        */
       String myJsonObj2 = "{\n" +
               "    \"name\":\"网站\",\n" +
               "    \"num\":3,\n" +
               "    \"sites\": [\n" +
               "        { \"name\":\"Google\", \"info\":[ \"Android\", \"Google 搜索\", \"Google 翻译\" ] },\n" +
               "        { \"name\":\"Runoob\", \"info\":[ \"菜鸟教程\", \"菜鸟工具\", \"菜鸟微信\" ] },\n" +
               "        { \"name\":\"Taobao\", \"info\":[ \"淘宝\", \"网购\" ] }\n" +
               "    ]\n" +
               "}";
       JSONObject jsonobj2 = JSON.parseObject(myJsonObj2); //将json字符串转换成jsonObject对象
       System.out.println(jsonobj2.get("sites"));
       System.out.println(jsonobj2.getString("sites"));
       System.out.println(jsonobj2.getJSONArray("sites")); //取出sites对应的value值,得到一个JSONOArray对象
       //System.out.println(jsonobj2.getJSONObject("sites")); 不能用该方法,因为sites是一个JSONOArray对象
       //取出json对象中sites对应数组中第一个json子对象的值
       System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0)); //得到结果:{"name":"Google","info":["Android","Google 搜索","Google 翻译"]}
       System.out.println(jsonobj2.getJSONArray("sites").get(0));
       System.out.println(jsonobj2.getJSONArray("sites").getString(0));
       //取出json对象中sites对应数组中第一个json子对象下面info对应的嵌套子数组值
       System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0).getJSONArray("info")); //得到结果:["Android","Google 搜索","Google 翻译"]
       //取出json对象中sites对应数组中第一个json子对象下面info对应的嵌套子数组中第二个值
       System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0).getJSONArray("info").getString(1)); //得到结果:Google 搜索
       //依次取出json对象中sites对应数组中的值
       JSONArray array = jsonobj2.getJSONArray("sites");
       getJsonArrayItem(array);
       //依次取出json对象中sites对应数组中第二个json子对象下面info对应的嵌套子数组值
       JSONArray arr = jsonobj2.getJSONArray("sites").getJSONObject(1).getJSONArray("info");
       getJsonArrayItem(arr);
    }
   /**
    * 手动添加对象到一个JSONObject
    */
   private static void writeStrToJSONObject() {
       JSONObject jsonObject = new JSONObject();
       jsonObject.put("name","tom");
       jsonObject.put("age",20);
       JSONArray jsonArray = new JSONArray();
       JSONObject jsonArrayObject1 = new JSONObject();
       jsonArrayObject1.put("name","alibaba");
       jsonArrayObject1.put("info","www.alibaba.com");
       JSONObject jsonArrayObject2 = new JSONObject();
       jsonArrayObject2.put("name","baidu");
       jsonArrayObject2.put("info","www.baidu.com");
       jsonArray.add(jsonArrayObject1);
       jsonArray.add(jsonArrayObject2);
       jsonObject.put("sites",jsonArray);
       System.out.println(jsonObject);
    }
   /**
    * 将字符串转为JSONArray
    */
   private static void strToJsonArray() {
       String arrayStr = "[\n" +
               "        {\n" +
               "            \"name\":\"alibaba\",\n" +
               "            \"info\":\"www.alibaba.com\"\n" +
               "        },\n" +
               "        {\n" +
               "            \"name\":\"baidu\",\n" +
               "            \"info\":\"www.baidu.com\"\n" +
               "        }\n" +
               "    ]";
       JSONArray array = JSON.parseArray(arrayStr);
       System.out.println(array);
    }
   /**
    * 依次取出JSONArray中的值
    */
   private static void getJsonArrayItem(JSONArray array) {
       for (int i=0; i<array.size(); i++) {
           System.out.println(array.get(i));
       }
   }
    //测试类
   public static void main(String[] args) {
       strWritedToJSONObject();
       //writeStrToJSONObject();
       //strToJsonArray();
   }
}

JAVABEAN转JSONObject

String jsonString=JSONObject.toJSONString(param);
JSONObject jSONObject=JSONObject.parseObject(jsonString);

来源:https://jiandansuifeng.blog.csdn.net/article/details/80700756

标签:Java,多层嵌套,JSON,数据
0
投稿

猜你喜欢

  • C#中32位浮点数Float(Real)一步步按位Bit进行分析

    2023-07-19 16:01:20
  • Android Fragment+FragmentTabHost组件实现常见主页面(仿微信新浪)

    2023-10-20 10:00:50
  • java开发分布式服务框架Dubbo原理机制详解

    2023-01-04 19:53:01
  • springMVC实现文件上传和下载

    2023-04-17 16:39:07
  • Java设计模式之代理模式(Proxy模式)介绍

    2023-04-27 16:01:34
  • 浅析Java中对象的创建与对象的数据类型转换

    2023-11-26 09:20:07
  • C#实现文本转语音功能

    2021-07-07 20:20:54
  • Java同步函数代码详解

    2022-10-13 23:22:03
  • 解决mybatis-generator生成器添加类注释方法无效的问题

    2023-12-05 06:34:57
  • Android 动态改变布局实例详解

    2023-11-25 22:04:49
  • java实现双人五子棋游戏

    2022-05-14 04:40:07
  • Unity实现倒计时组件

    2021-06-18 01:06:44
  • 详解Flutter中视频播放器插件的使用教程

    2023-06-15 23:47:31
  • MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    2023-04-15 03:34:50
  • 使用javafx更新UI的方法

    2023-05-02 17:32:30
  • Java高级面试题小结

    2023-11-23 07:34:00
  • Unicode、UTF-8 和 ISO8859-1区别解析

    2021-06-02 07:45:57
  • Spring自动装配之方法、构造器位置的自动注入操作

    2021-11-30 23:28:40
  • SpringBoot整合Shiro的代码详解

    2023-10-30 10:53:31
  • java动态线程池的简单实现思路

    2023-10-18 15:53:46
  • asp之家 软件编程 m.aspxhome.com