首先复习一下JSON

在标准的 json 格式中,json 对象由在括号括起来,对象中的属性也就是 json 的 key 是一个字符串,所以一定要使用 双引号引起来。每组 key 之间使用逗号进行分隔。

Json 定义格式:

var 变量名 = { 
		“key” : value , // Number 类型 
		“key2” : “value” , // 字符串类型 
		“key3” : [] , // 数组类型 
		“key4” : {}, // json 对象类型
		“key5” : [{},{}] // json 数组
};

例如:

var jsons = { 
	"key1":"abc", // 字符串类型
	"key2":1234, // Number 
	"key3":[1234,"21341","53"], // 数组 
	"key4":{ // json 类型 
		"key4_1" : 12, 
		"key4_2" : "kkk" 
	},
	"key5":[{ // json 数组 
		"key5_1_1" : 12, 
		"key5_1_2" : "abc" 
		},
		{ 
		  "key5_2_1" : 41, 
		    "key5_2_2" : "bbj"  
		 }]
 };

所以,注意到JSON的key都是字符串,类型也只有几种(和Java不一样!)

JSON对象的访问:

json 对象,顾名思义,就知道它是一个对象。里面的 key 就是对象的属性。我们要访问一个对象的属性,只需要使 用【对象名.属性名】的方式访问即可。

alert(jsons.key1); // "abc" 
// 访问 json 的数组属性 
alert(jsons.key3[1]); // "21341" 
// 访问 json 的 json 属性 
alert(jsons.key4.key4_1);//12 
// 访问 json 的 json 数组 
alert(jsons.key5[0].key5_1_2);//"abc"

JSON 对象和字符串对象的互转:( 前端)

JSON.stringify( json ); : 此方法可以把一个 json 对象转换成为 json 字符串
JSON.parse( jsonString);:此方法可以把一个 json 字符串转换成为 json 对象


测试开始

放上我的实验:
首先在eolinker(postman)中设置url,在请求体中选择raw类型

{
    "map" : {
        "1" : 1,
        "6" : 5,
        "7" : "6"
    },
    "remarks" : "空备注"
}

直接用map接收:
public RetJson testJson(@RequestBody Map<Object, Object> map, String remarks)

此时我发现debug得到的数据是:

java json里key值动态怎么取值_JSON


也就是说,入参得到的,是一个LinkedHashMap<String, Object>

然后这个map中得到了两个数据:1. key是"map",然后value是一个LinkedHashMap (size = 3),这个map里面放了3条数据;

2. 第二个key就是remarks,然后这个的value就是String:“空备注”

所以用这个方式是无法获取到在参数中取到remarks(null)的,只可以从map里面取值;

所以如果说是用这种方法的话,可以换种方法就是在remarks前面加上@RequestParam,让前端传值的时候传在URL上面拼接参数;

经过实验,如果在map前面去掉@RequestBody的话,是无法解析得到map数据的。因此使用map的话这里一定要加上注解

复杂一点,如果要传许多map、list的话,怎么做呢?

还是用实体类来接收吧!

例如, 我写一个Json类来获取请求体里面的参数:

@Data
public class Json {
    private Map<Object, Object> map;
    private List<String> list;
    private Map<String, List<Integer>> listMap;
    private String string;
    private Integer i;
    private SmallJson smallJson;
}

其中SmallJson类:(注意一定要写getter和setter方法,否则会解析不出来;)

@Data
public class SmallJson {
    private Integer si;
    private String ss;
}

写个接口来接受参数:

@PostMapping("/test/testJson2")
    public RetJson<Json> testJson2(@RequestBody Json json){
        System.out.println(json);
        return RetJson.success(json);
    }

测试:使用eolinker(和postman一样,中文的)这里除了在eolinker使用raw类型之外,使用JSON(左2)来测试应该也可以的

java json里key值动态怎么取值_json_02

{
    "map" : {
        "1" : 1,
        "6" : 5,
        "7" : "6"
    },
    "list" : ["1", 2, "33", "444",555],
    "listMap" : {
        "A" : [1,2,"3"],
        "B" : [3,2,1]
    },
    
    "string" : "str",
    "i" : 100,
    "smallJson" : {
        "si" : 99,
        "ss" : 88
    }       
}

使用idea debug得到的数据:

java json里key值动态怎么取值_JSON_03


返回打印的信息:

{
    "code": 200,
    "message": "操作成功",
    "data": {
        "map": {
            "1": 1,
            "6": 5,
            "7": "6"
        },
        "list": ["1", "2", "33", "444", "555"],
        "listMap": {
            "A": [1, 2, 3],
            "B": [3, 2, 1]
        },
        "string": "str",
        "i": 100,
        "smallJson": {
            "si": 99,
            "ss": "88"
        }
    }
}

可以看到:使用jackson可以帮我妈自动解析数据:

比如上面传的list和listMap中有的数据类型是不匹配的,jackson可以帮我们自动在String和Integer之间进行了转化。


其他在其他地方看到的知识:

比如说,还可以自定义转化器:

@Component
@RequiredArgsConstructor
public class StringToMapConverter implements Converter<String, Map<String, Object>> {
  private final ObjectMapper objectMapper;
  @Override
  public Map<String, Object> convert(String source) {
    try {
      return objectMapper.readValue(source, new TypeReference<Map<String, String>>() {
      });
    } catch (final IOException e) {
      return null;
    }
  }
}

除此之外,如果我们要传递文件的话,怎么办呢?

其实对于后端来说还是一样,比较简单:

java json里key值动态怎么取值_JSON_04

然后使用eolinker测试的时候

java json里key值动态怎么取值_java_05


记得还要改请求头为multipart/form-data;

不过我跟前端测试的时候弄了蛮久,因为前端传参数的时候,file名称弄错,还有没有仔细看element的文档😢

然后我后面进行了抓包,确实可以哦,比如这样:

java json里key值动态怎么取值_json_06

主要就是注意这个boundry是分割的。其他的话只要和前端配合好就可以传了。