Java 多层嵌套JSON类型数据解析及fastjson2的使用

一、简单来说,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+的防晒护肤品,戴帽子、太阳镜。"
                }
            ]
        }
    ]
}

  • json解析代码:

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);
        }
    }
}
}

二、使用FastJson对JSON字符串、JSON对象及JavaBean之间的相互转换

  1. 常用类和方法

在fastjson 2.0中,package和1.x不一样,是com.alibaba.fastjson2。如果你之前用的是fastjson1,大多数情况直接更包名就即可

package com.alibaba.fastjson2;

class JSON {
    // 将字符串解析成JSONObject
    static JSONObject parseObject(String str);
    
    // 将字符串解析成JSONArray
    static JSONArray parseArray(String str);
    
    // 将字符串解析成Java对象
    static T parseObject(byte[] utf8Bytes, Class<T> objectClass);
 
    // 将Java对象输出成字符串
    static String toJSONString(Object object);
    
    // 将Java对象输出成UT8编码的byte[]
    static byte[] toJSONBytes(Object object);
}
 
class JSONB {
    // 将jsonb格式的byte[]解析成Java对象
    static T parseObject(byte[] jsonbBytes, Class<T> objectClass);
    
    // 将Java对象输出成jsonb格式的byte[]
    static byte[] toBytes(Object object);
}
 
class JSONObject {
    Object get(String key);
    int getIntValue(String key);
    Integer getInteger(String key);
    long getLongValue(String key);
    Long getLong(String key);
    T getObject(String key, Class<T> objectClass);
    
    // 将JSONObject对象转换为Java对象
    T toJavaObject(Class<T> objectClass);
}
 
class JSONArray {
    Object get(int index);
    int getIntValue(int index);
    Integer getInteger(int index);
    long getLongValue(int index);
    Long getLong(int index);
    T getObject(int index, Class<T> objectClass);
}
 
class JSONPath {
    // 构造JSONPath
    static JSONPath of(String path);
 
    // 根据path直接解析输入,会部分解析优化,不会全部解析
    Object extract(JSONReader jsonReader);
    
    // 根据path对对象求值
    Object eval(Object rootObject);
}
 
class JSONReader {
    // 构造基于String输入的JSONReader
    static JSONReader of(String str);
    
    // 构造基于ut8编码byte数组输入的JSONReader
    static JSONReader of(byte[] utf8Bytes);
    
    // 构造基于char[]输入的JSONReader
    static JSONReader of(char[] chars);
    
    // 构造基于json格式byte数组输入的JSONReader
    static JSONReader ofJSONB(byte[] jsonbBytes)
}

  1. 读取JSON对象

String str = "{\"id\":123}";
JSONObject jsonObject = JSON.parseObject(str);
int id = jsonObject.getIntValue("id");
String str = "[\"id\", 123]";
JSONArray jsonArray = JSON.parseArray(str);
String name = jsonArray.getString(0);
int id = jsonArray.getIntValue(1);
  1. 将JavaBean对象生成JSON

  • 将JavaBean对象生成JSON格式的字符串

class Product {
 public int id;
 public String name;
}
 
Product product = new Product();
product.id = 1001;
product.name = "DataWorks";
 
JSON.toJSONString(product);
 
// 生成如下的结果
{
 "id" : 1001,
 "name" : "DataWorks"
}
 
JSON.toJSONString(product, JSONWriter.Feature.BeanToArray);
// 生成如下的结果
[123, "DataWorks"]
  • 将JavaBean对象生成UTF8编码的byte[]

Product product = ...;
byte[] utf8JSONBytes = JSON.toJSONBytes(product);
  • 将JavaBean对象生成JSONB格式的byte[]

Product product = ...;
byte[] jsonbBytes = JSONB.toBytes(product);
byte[] jsonbBytes = JSONB.toBytes(product, JSONWriter.Feature.BeanToArray);
  1. 读取JavaBean

  • 将字符串读取成JavaBean

  • 将UTF8编码的byte[]读取成JavaBean

byte[] utf8Bytes ="{\"id\":123}".getBytes(StandardCharsets.UTF_8);Product product = JSON.parseObject(utf8Bytes,Product.class);12
  • 将JSONB数据读取成JavaBean

byte[] jsonbBytes =...Product product = JSONB.parseObject(jsonbBytes,Product.class);Product product = JSONB.parseObject(jsonbBytes,Product.class,JSONReader.Feature.SupportBeanArrayMapping);123
  1. 使用JSONPath

  • 使用JSONPath部分读取数据

String str =...;JSONPath path =JSONPath.of("$.id");// 缓存起来重复使用能提升性能JSONReader parser =JSONReader.of(str);Object result = path.extract(parser);1234
  • 使用JSONPath读取部分utf8Bytes的数据

byte[] utf8Bytes =...;JSONPath path =JSONPath.of("$.id");// 缓存起来重复使用能提升性能JSONReader parser =JSONReader.of(utf8Bytes);Object result = path.extract(parser);1234
  • 使用JSONPath读取部分jsonbBytes的数据

byte[] jsonbBytes =...;
JSONPath path =JSONPath.of("$.id");// 缓存起来重复使用能提升性能JSONReader parser =JSONReader.ofJSONB(jsonbBytes);// 注意,这是利用ofJSONB方法

猜你喜欢

转载自blog.csdn.net/m0_58019259/article/details/128582336