unity使用json踩坑记录【客户端服务器开发】

1.Json推荐

不要使用unity自带的 JsonUtility

它的功能各种不足,出各种问题

建议使用Newtonsoft.Json 功能强大

下面是Newtonsoft.Json的dll文件,直接放unity文件夹里面就可以用

阿里云盘分享https://www.aliyundrive.com/s/Y7EYdHmeVbo

c#的Newtonsoft.Json简单使用

JsonConvert.SerializeObject(对象);    //对象转json
JsonConvert.DeserializeObject<targetType>(json);  //json转对象
【注意,转换要求】

条件只有一个:

与json转换的字段必须是 public的 或者由属性包装的

 如果你使用C#的Newtonsoft.Json 与java通讯

java这边的json建议使用jackson

fastjson2与Newtonsoft.Json相互之间有点json解析不了

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

java的jackson简单使用

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValueAsString(object);       //【对象转json】

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.readValue(json, ClassType);        //【json转对象】

需要注意的是:

new ObjectMapper();

每次new出来的jackson都是全新不同的jackson

所以建议就new一个,存起来公共使用,每次用都new一个新的非常不推荐

2.Json与byte[]数据转换

有的时候我们需要json转为字节进行传输,简单的转换如下

 C#:

Encoding.UTF8.GetBytes(json);    //【json转byte[]】
Encoding.UTF8.GetString(bytes);  //【byte[]转json】

java:

json.getBytes("utf-8"); //【json转byte[]】

new String(bytes, "utf-8"); //【byte转json】

3.客户端服务端json通讯数据体

为了避免出现不必要的错误,建议通讯数据满足以下几点

1.私有字段

2.包装字段(jack记得设置属性忽略大小填充)

3.空参构造器

4.扩展方法不要放通讯数据里面

public class NetData
{
    private HashMap<String,Object> mapDatas;

    public NetData()
    {
        this.mapDatas = new HashMap<>();
    }

    public NetData add(String k,Object o){
        mapDatas.put(k,o);
        return this;
    }
    public <T> T get(String k,Class<T> vType){
        T t = (T) mapDatas.get(k);
        return t;
    }

    public HashMap<String, Object> getMapDatas()
    {
        return mapDatas;
    }

    public void setMapDatas(HashMap<String, Object> mapDatas)
    {
        this.mapDatas = mapDatas;
    }
    
}
public class NetDataHelp
{
    //int1 string2
    public static NetData addSingleInt(int v){
        return new NetData().add("1",v);
    }
    public static int getSingleInt(NetData netData){
        return netData.get("1",int.class);
    }
    public static NetData addSingleString(String v){
        return new NetData().add("2",v);
    }
    public static String getSingleString(NetData netData){
        return new NetData().get("2",String.class);
    }
}

 4.Json传输的踩坑记录

1.大小写区分

name="小明"  填充不到Name字段里面

java的jackson

如果你的字段是私有的 且被getset包装

那么json解析的时候这个字段默认是小写开头的 

比如getName 就会解析为name(小写开头的)

C#的newtonsoft

如果你的字段是私有的 且被属性包装

那么json解析的时候这个字段默认是大写开头的 

比如Name{get;set} 就会解析为Name(大写开头的)

当jackson和C#交互json的时候,私有属性各自包装后各不相同

java字段是小写的name

C#字段是大写的Name

导致字段无法填充

解决方案

把你公共使用的jackson对象进行以下设置

objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES,true);

这个设置就是忽略属性填充的大小写 即使是Name也可以填充到name里面

2.方法命名规范

java如果要在数据传输类里面加辅助方法 不要以getXXX,setXXX为命名

json填充字段的时候会误以为这是字段包装器

比如传输类里面写个get/setSingleString方法

那就完蛋了,json填充的时候他会自动去找SingleString这个字段

总之还是希望数据传输类里面方法都不要有,只有数据本体等,

辅助方法可以另写一个类。

猜你喜欢

转载自blog.csdn.net/qq_46335546/article/details/128434228