springboot 项目整合fastjson:javabean对象、Json 字符串、字符串 与 Json 对象的转化;Json的其他问题

心不动则不痛 提交于 2019-12-18 05:10:46

前言

做项目的时候,遇到了好多关于Json转化的问题,比如

  1. java 对象、Json 字符串 与 Json对象的互相转化
  2. Json 对象做Get请求参数的编码问题

等等,以后再遇到什么问题,我再继续补充,实时更新。。。
原来每次遇到都要现找资料,这次做个笔记,总结一下。
我以springboot项目进行测试。

一、测试前准备

1. maven依赖

<!--fastjson-->
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.12</version>
 </dependency>

<!--junit 测试单元-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

2. User类(Java对象)

我这里使用的 lombok插件

package com.feng.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private String name;
    private String address;
    private String passwd;
}

二、JSON的互相转换

1. Java 对象转换到 Json对象

java 对象转化至Json对象,需两步:

  1. 将java对象转换至Json字符串
  2. 将Json字符串转换至 Json 对象
package com.feng.json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.feng.bean.User;
import org.junit.Test;

public class JsonTest {
    @Test
    public void javaobjToJsonobj() {
        System.out.println("****************************** JavaBean 转成 Json对象 :三个方法************************************");
        User user = new User("feng","济南","123");

        JSONObject o = (JSONObject) JSONArray.toJSON(user);
        System.out.println("方法1:java 对象通过 JSONArray.toJSON(user) 转换成 Json 对象(需强转)"+o);
        Object o1 = JSONObject.toJSON(user);
        System.out.println("方法2:java 对象通过 JSONObject.toJSON(user) 转换成 Json 对象(需强转)"+o1);

        String s1 = JSON.toJSONString(user);
        System.out.println("方法3.1:对象JSON.toJSONString(user) 通过转成的 json字符串:"+s1);
        JSONObject jsonObject = JSONObject.parseObject(s1);
        System.out.println("方法3.2:json字符串通过 JSONObject.parseObject(s1) 转换成 json 对象:"+jsonObject);
        //JSONObject json1 = JSONObject.parseObject(user.toString());
        // System.out.println("111:"+json1);
        /**
         *  会报错  syntax error, pos 1  语法错误。
         *  将对象转成 json 对象 需要两步:1、对象转成 json 字符串,2、json 字符串转成 json 对象
         *  这里user.toString() 仅将对象转成字符串 而不是 json 字符串
         */
    }
}

结果:
在这里插入图片描述

2. json 字符串转换成Json 对象

方法都在同一个类

@Test
public void jsonstrToJsonobj(){
    System.out.println("****************************** Json字符串 转成 Json对象:两个方法 ************************************");
    String s = "{\"address\":\"济南\",\"passwd\":\"123\",\"name\":\"feng\"}";
    JSONObject json = JSONObject.parseObject(s);
    System.out.println("方法1:json字符串通过JSONObject.parseObject() 转成json对象:"+json);
    JSONObject parse = (JSONObject) JSONObject.parse(s);
    System.out.println("方法2:json字符串通过JSONObject.parse() 转成json对象(需要强转):"+parse);
}

在这里插入图片描述
总结:

  • 两个方法都可以,但是第二个方法需要强转。

3. Json字符串转换至Java对象

@Test
public void jsonstrToUserobj(){
   System.out.println("****************************** Json字符串 转成 Java对象:两个方法 ************************************");
   String s1 = "{\"address\":\"济南\",\"passwd\":\"123\",\"name\":\"feng\"}";
   System.out.println("Json 字符串为:"+s1);
   User user = JSONObject.parseObject(s1, User.class);
   System.out.println("json字符串通过 转换至java对象:"+user.toString());
}

在这里插入图片描述

4. map 集合转换为 Json 对象

    @Test
    public void mapToJsonobj(){
        System.out.println("****************************** map 集合转换为 Json 对象 ************************************");

        Map<String, Object> map = new HashMap<>();
        map.put("1","feng");
        map.put("2",23);
        map.put("3","济南");
        System.out.println("map 集合通过 map.toString() 转换成 字符串:"+map.toString());
        
        JSONObject jsonObject = (JSONObject) JSONObject.toJSON(map);
        
        System.out.println("map 集合通过 JSONObject.toJSON(map) 转换成 Json对象(需强转):"+jsonObject);
    }

在这里插入图片描述

5. 遍历JSONArray

    @Test
    public void readJsonarray() {
        String strData = "[{\"name\":\"zhangsan\"},{\"name\":\"fenganchen\"}]";
        JSONArray jsons = JSONArray.parseArray(strData); // 首先把字符串转成 JSONArray 对象
        System.out.println("方法 1:直接使用for 循环的遍历");
        if (jsons.size() > 0) {
            for (int i = 0; i < jsons.size(); i++) {
                JSONObject job = jsons.getJSONObject(i); // 遍历 jsonarray 数组,把每一个对象转成 json 对象
                System.out.println(job.get("name"));    // 得到 每个对象中的属性值
            }
        }
        System.out.println("方法 2:for循环遍历的技巧");
        if (jsons.size() > 0) {
            for (Iterator tor = jsons.iterator(); tor.hasNext(); ) {
                JSONObject job = (JSONObject) tor.next();
                System.out.println(job.get("name"));
            }
        }
    }

在这里插入图片描述

三、JSON的其他问题

1. JSON作为Get请求方法的参数

问题描述:

java.net.URISyntaxException: Illegal character in query at index 46
// 即:java.net.urisyntaxception:索引46处的查询中存在非法字符

我再微服务中底层发送一个get请求,请求参数为json,url为:String url111 = url+"?Condition="+json。
但是报错了。纠结。

搞了一上午,查阅资料发现。传参时,不能有特殊字符,如:{、/、||等等。
当然我这里也没有,但是json中的 { [, 等 就不行,因此需要转码。
Java jdk 有自带的方法,我直接放上:
解决方法:

java中转码:String encode = URLEncoder.encode(JSONObject.toJSONString(json),"UTF-8")
js中转码:var str = encodeURI(JSON.stringify(json),'utf-8')

则请求可使用了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!