JSON用法+测试用例

/**
 * 数据类型有六种:
 * 字符串、数值、布尔值、null、对象、数组
 * 
 * 1、字符串(使用\转义)
 * {
 *     "name1":"xch",
 *     "name2":"\"xch\""
 * }
 * 
 * 2、数值(正负小数,可以使用科学计数)
 * {
 *     "number1":100,
 *     "number2":-100,
 *     "number3":99.99,
 *     "number4":1e2,
 *     "number5":-1E2
 * }
 * 
 * 3、布尔值
 * {
 *     "flag1":true,
 *     "flag2":false
 * }
 * 
 * 4、null
 * {
 *     "flag":null
 * }
 * 
 * 5、对象(通过.访问对象属性)
 * {
 *     "object1":{
 *         "name":"xch",
 *         "age":21
 *     },
 *     "object2":{
 *         "name":"ypy",
 *         "age":20
 *     }
 * }
 * 
 * 6、数组(通过[0,n-1]访问数组元素)
 * {
 *     "arr1":[1,2,3,4,5],
 *     "arr2":["a","b","c","d","e"],
 *     "arr3":[true,null,false],
 *     "arr4":[{"name":"a","age":1},{"name":"b","age":2},{"name":"c","age":3}]
 * }
 * 
 * JSON用法说明
 * 1、可以无限嵌套
 * 2、通过键名匹配获取值
 * 3、数组中可以放多个类型数据
 * 如:java中(Object[] objs={"errw", 434, -4.32, null, {name="xch", user02=null}, false, true})
 * {
 *     "objs":["errw",434,-4.32,null,{"name":"xch","user02":null},false,true]
 * }
 * 其中,该JSON数组中读取的对象为Object[],转为Map键值对形式使用
 * 通过((Map<?, ?>) objs[4]).get("name")取值
 * 4、在输入参数只有一个对象时,直接用{}封装属性字段赋值即可
 * 5、并行字段用,分隔
 */
/**
 * Web总结:
 *
 * 两种请求:
 * -GET:GET服务端可以使用GET和POST请求均可,参数仅能在URL中传入
 * -POST:POST服务端仅可以使用POST请求,参数可以在URL和Body均可传入
 * (通常使用POST请求,GET请求一般用于从服务端获取数据,POST请求一般用于向服务端发送数据)
 *
 * 传参方式:
 * -URL:在URL中的参数
 * -Body:封装在HTTP-Body中的参数
 *   -form-data:用于传键值或附件(一个或多个)
 *   -x-www-form-urlencoded:用于传键值
 *   -binary:用于仅传一个附件
 *   -raw:原生文本
 *     -Text:纯文本
 *     -JSON:JSON解析文本
 *     -XML:XML解析文本
 *     -HTML:HTML解析文本
 *     -JavaScript:JS解析文本
 * (八大基本数据类型及其引用类型可以通过在GET/POST请求的URL传入,其它对象只能通过JSON形式解析传入)
 * (JSON对象只能通过POST请求的Body传入,也可以通过JSON字符串在GET/POST请求的URL传入,手动转Map解析)
 * 
 * 传输效果:
 * -非JSON(键值)传值
 * -JSON传值
 *   共性:1、单值解析,前后空格会传入
 *        2、数组和集合传值效果(格式、解析)一样
 *        3、数组/集合解析规则,按,分割
 *        4、数组/集合解析换行符不影响,每项值前后空格会消除
 *   异性:5、JSON解析数组/集合、对象时,值需加""
 *        6、JSON解析对象时,需加""引用属性名,进行键值:匹配
 *        7、JSON默认解析工具为SpringBoot内置的jackson依赖(单双引号解析不通用)
 *        8、JSON解析内置("属性型")对象时,需加""引用属性对象名,进行键值:匹配
 *          (因为解析对象时,属性间相同类型可能有多个,必须匹配属性名,对象、数组/集合不例外)
 *
 * 作为请求的参数对象:
 * 1、属性需为public或者有Get/Set方法
 * 2、属性须使用引用数据类型(如:Boolean),因为基本数据类型容易失参
 */
package com.xch.test05;

import lombok.Data;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

/**
 * 前后端传值测试
 *
 * @author Chenghe Xu
 * @date 2022/12/12 11:28
 */
@RestController
public class ControllerTest02 {
    
    /**
     * 非JSON(键值)传值测试
     *
     * 传值方式:
     * -GET/POST的URL
     * -POST的form-data/x-www-form-urlencoded
     *
     * -String
     * -成功:val
     * -成功:     val     
     *
     * -数组/集合
     * -成功:val1,
     *       val2,
     *       val3
     * -成功:val1,  val2  ,val3  
     *
     * 结论:
     * 1、单值解析,前后空格会传入
     * 2、数组和集合传值效果(格式、解析)一样
     * 3、数组/集合解析规则,按,分割
     * 4、数组/集合解析换行符不影响,每项值前后空格会消除
     */
    @RequestMapping("/test1")
//    public void test1(String str, String[] strs, @RequestParam("strList") List<String> strList) {
    public void test1(String str, String[] strs, @RequestParam("strSet") Set<String> strSet) {
        System.out.println(str);
        System.out.println(Arrays.toString(strs) + "--" + strs.length);
//        System.out.println(strList + "--" + strList.size());
        System.out.println(strSet + "--" + strSet.size());
    }
    
    /**
     * JSON传值测试(后端需使用@RequestBody声明变量,每次只能传一个JSON对象或变量)
     *
     * 传值方式:
     * -POST的raw选择JSON解析格式
     *
     * -String
     * -成功:val
     * -成功:     val     
     *
     * -数组/集合
     * -成功:[
     *          "val1",
     *          "val2",
     *          "val3"
     *       ]
     * -成功:["val1" , "val2" , "val3"]
     * 
     * -对象
     * -成功:{
     *          "name": "小徐",
     *          "age": 21
     *       }
     * 
     * -数组/集合
     * -成功:[
     *          {
     *              "name": "小徐",
     *              "age": 21
     *          },
     *          {
     *              "name": "小杨",
     *              "age": 22
     *          }
     *       ]
     *
     * 结论:
     * 5、JSON解析数组/集合、对象时,值需加""
     * 6、JSON解析对象时,需加""引用属性名,进行键值:匹配
     * 7、JSON默认解析工具为SpringBoot内置的jackson依赖(单双引号解析不通用)
     */
    @RequestMapping("/test2")
//    public void test2(@RequestBody String str) {
//    public void test2(@RequestBody String[] strs) {
//    public void test2(@RequestBody List<String> strList) {
//    public void test2(@RequestBody Set<String> strSet) {
//    public void test2(@RequestBody Obj obj) {
//    public void test2(@RequestBody Obj[] objs) {
//    public void test2(@RequestBody List<Obj> objList) {
    public void test2(@RequestBody Set<Obj> objSet) {
//        System.out.println(str);
//        System.out.println(Arrays.toString(strs) + "--" + strs.length);
//        System.out.println(strList + "--" + strList.size());
//        System.out.println(strSet + "--" + strSet.size());
//        System.out.println(Arrays.toString(objs) + "--" + objs.length);
//        System.out.println(objList + "--" + objList.size());
        System.out.println(objSet + "--" + objSet.size());
    }
    
    /**
     * JSON传值测试-内嵌("属性型")对象
     * 
     * 传值方式:
     * -POST的raw选择JSON解析格式
     * 
     * -对象-内嵌("属性型")对象
     * -成功:{
     *          "obj":{
     *              "name": "小杨",
     *              "age": 22
     *          }
     *       }
     * -对象-内嵌("属性型")数组/集合
     * -成功:{
     *          "objs":[
     *              {
     *                  "name": "小徐",
     *                  "age": 21
     *              },
     *              {
     *                  "name": "小杨",
     *                  "age": 22
     *              }
     *          ],
     *          "objList":[
     *              {
     *                  "name": "小佩",
     *                  "age": 23
     *              },
     *              {
     *                  "name": "小莹",
     *                  "age": 24
     *              }
     *          ]
     *       }
     * 
     * 结论:
     * 8、JSON解析内置("属性型")对象时,需加""引用属性对象名,进行键值:匹配
     *   (因为解析对象时,属性间相同类型可能有多个,必须匹配属性名,对象、数组/集合不例外)
     */
    @RequestMapping("/test3")
    public void test3(@RequestBody InlayObj inlayObj){
        System.out.println(inlayObj);
    }
    
}

/**
 * 接收前端参数的对象属性
 * -要么是public修饰
 * -要么有get/set方法
 *
 * @author Chenghe Xu
 * @date 2022/12/12 14:59
 */
@Data
class Obj {
    private String name;
    private Integer age;
}

@Data
class InlayObj {
    private String name;
    private Integer age;
    //内嵌对象
    private Obj obj;
//    private Obj[] objs;
    private List<Obj> objList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BB-X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值