用fastjson把网络传输的字符串转换为java对象

这里举例一个网络传输来的字符串(json格式字符串)
[{ “foodLangInfoVOList”: [{“name”: “soli”}], “menuFoodRelationVO”: {“amount”: “14”, “secUnitDesc”: “łyżeczki”}, “desc”: “płaskie” }, {“foodLangInfoVOList”: [{“name”: “wody”}], “menuFoodRelationVO”: {“amount”: “1500”, “secUnitDesc”: “null”}, “desc”: “null”}]

这里解释下:
上面是一个JSON格式的字符串,其中包含了两个对象,每个对象有三个属性,分别是 “foodLangInfoVOList”、“menuFoodRelationVO” 和 “desc”。其中 “foodLangInfoVOList” 和 “menuFoodRelationVO” 属性的值也是对象,它们分别包含了各自的属性和属性值。该字符串的具体含义需要根据上下文和业务场景进行解析,(这里用来app传输食材表,这篇文章无需关注这个)

可以看出上面的是个json数组字符串,这个jsonarray字符串里面中的每一个元素都有一个foodLangInfoVOList字段的数组,数组的第一个元素里包含name字段,包含一个key为menuFoodRelationVO的对象,该key的value中包含amount、secUnitDesc,
最后包含一个key为desc的字段。

JSON 格式的字符串是一种数据序列化的格式,用于数据的传输和存储,可以表示不同的数据结构,如对象、数组、字符串、数字等。在 Java 中,可以通过解析 JSON 字符串来得到对应的 JSON 对象

这里解释下,这个json字符串是我在ide中用输出函数打印的结果,真实网络传输中的json格式字符串是包含转义字符的,在控制台中打印JSON字符串时,通常会将其还原成原始的字符串形式,因此看不到转义字符。
转义字符 \ 是为了区分字符串中的特殊字符,如双引号 ", 换行符 \n, 制表符 \t 等。当我们直接打印一个字符串到控制台时,控制台会自动解析这些特殊字符,将其显示为其对应的字符,而不是转义字符本身。所以你在控制台打印看到的是字符本身,而不是转义字符。

将这个网络传输的字符串转换为java对象
先贴java对象的代码,

package com.chuyitech.gourmagic.device.vo;

import java.util.List;

/**
 * Created by sjx on 4/18/23
 * tuya食材表
 */
public class TuyaFoodInfoVo {
    List<FoodLangInfoVO> foodLangInfoVOList;
    MenuFoodRelationVO menuFoodRelationVO;
    String desc; //补充说明

    public List<FoodLangInfoVO> getFoodLangInfoVOList() {
        return foodLangInfoVOList;
    }

    public void setFoodLangInfoVOList(List<FoodLangInfoVO> foodLangInfoVOList) {
        this.foodLangInfoVOList = foodLangInfoVOList;
    }

    public MenuFoodRelationVO getMenuFoodRelationVO() {
        return menuFoodRelationVO;
    }

    public void setMenuFoodRelationVO(MenuFoodRelationVO menuFoodRelationVO) {
        this.menuFoodRelationVO = menuFoodRelationVO;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public class FoodLangInfoVO {
        String name; //食材名

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "FoodLangInfoVO{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    public class MenuFoodRelationVO {
        String amount; //食材数量
        String secUnitDesc; //食材单位

        public String getAmount() {
            return amount;
        }

        public void setAmount(String amount) {
            this.amount = amount;
        }

        public String getSecUnitDesc() {
            return secUnitDesc;
        }

        public void setSecUnitDesc(String secUnitDesc) {
            this.secUnitDesc = secUnitDesc;
        }

        @Override
        public String toString() {
            return "MenuFoodRelationVO{" +
                    "amount='" + amount + '\'' +
                    ", secUnitDesc='" + secUnitDesc + '\'' +
                    '}';
        }
    }

    @Override
    public String toString() {
        return "TuyaFoodInfoVo{" +
                "foodLangInfoVOList=" + foodLangInfoVOList +
                ", menuFoodRelationVO=" + menuFoodRelationVO +
                ", desc='" + desc + '\'' +
                '}';
    }
}

注意上面的对象是这个json字符串(数组数据)的元素的java结构
特别注意:使用fastjson解析json字符串时,一定要把对应的java对象加上gettersetter方法,不然无法注入,同时为了方便输出控制台日志,建议同时加上toString方法

直接给出json字符串转换成java对象的代码:

List<TuyaFoodInfoVo> foodInfoVoList = JSONObject.parseArray(material, TuyaFoodInfoVo.class);

因为程序中的material就是本文开头传输的json字符串,这里我用手写一个相同的json字符串

String json = "[{\"foodLangInfoVOList\":[{\"name\":\"soli\"}],\"menuFoodRelationVO\":{\"amount\":\"14\",\"secUnitDesc\":\"łyżeczki\"},\"desc\":\"płaskie\"},{\"foodLangInfoVOList\":[{\"name\":\"wody\"}],\"menuFoodRelationVO\":{\"amount\":\"1500\",\"secUnitDesc\":\"null\"},\"desc\":\"null\"}]";

注意看,这是带转义字符的,json字符串都带转义字符,只不过控制台打印的时候给消除了!
插句题外话:当你要发送包含特殊字符的数据(如双引号)时,需要手动添加转义字符。这是因为网络传输过程中,数据会经过多个中间节点的解析和转发,如果不进行转义,就可能会导致数据的格式出现问题。
这里贴出该json字符串去除转义后的json.cn网站的输出(这时输出的其实就是个json对象了,json对象不带转义字符):
在这里插入图片描述
这里简单解释下json格式的字符串,json对象,java对象的区别?
答:我在我以前写的文章里面写了互转方式,这里提下区别:
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它由键值对组成,可以表示简单的数据类型(如数字、字符串、布尔值、null)和复杂的数据类型(如数组、对象等)。JSON格式的字符串是一个字符串,遵循特定的语法规则,可以被解析成JSON对象。

JSON对象是指通过JSON格式的字符串解析出来的,具有键值对的属性和方法的JavaScript对象,它可以通过JavaScript的语法来操作和处理。

Java对象是指Java语言中定义的类的实例对象,具有类的属性和方法,可以通过Java的语法来操作和处理。通常在Java中,我们可以使用第三方库(如fastjson、gson等)将JSON格式的字符串转换成Java对象,或者将Java对象转换成JSON格式的字符串。

简单来说,JSON格式的字符串是一种表示数据的字符串格式,JSON对象是通过解析JSON格式的字符串而得到的JavaScript对象,Java对象是Java语言中定义的类的实例对象。我们可以使用相应的方法将它们之间相互转换,以达到数据处理和交换的目的。

这里继续用fastjson举个三者转换的小例子:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

从Java对象转换成JSON格式的字符串:

Person person = new Person("John", 30);
String jsonString = JSON.toJSONString(person);
System.out.println(jsonString); // 输出:{"age":30,"name":"John"}

从JSON格式的字符串转换成JSON对象:

String jsonString = "{\"age\":30,\"name\":\"John\"}";
JSONObject jsonObject = JSON.parseObject(jsonString);
System.out.println(jsonObject.getString("name")); // 输出:John

从JSON对象转换成Java对象:

JSONObject jsonObject = JSON.parseObject("{\"age\":30,\"name\":\"John\"}");
Person person = JSON.toJavaObject(jsonObject, Person.class);
System.out.println(person.getName()); // 输出:John

最后举个使用json.cn网站的注意事项
json.cn网站转换json对象(内部结构是对象)
在这里插入图片描述json.cn网站转换json对象(内部结构是数组)

注意注意,上述左边的一定得是个json对象(包括数组,只要符合json对象格式就行)才能转换成右边的json对象,如果左边的多了任何符号什么的只要不符合json格式都转换不成功,如果左边的带了转义字符也转换不成功,所以一般操作是直接把接口传输过来的网络数据打印在控制台(控制台会自动消除转义字符,消除后的字符串其实就是符合json格式了),然后拷贝到json.cn网站的左边,就能清晰看到右边的json对象了,然后再设计java对象。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值