1.Json推荐
不要使用unity自带的 JsonUtility
它的功能各种不足,出各种问题
建议使用Newtonsoft.Json 功能强大
下面是Newtonsoft.Json的dll文件,直接放unity文件夹里面就可以用
阿里云盘分享https://www.aliyundrive.com/s/Y7EYdHmeVbo
c#的Newtonsoft.Json简单使用
JsonConvert.SerializeObject(对象); //对象转jsonJsonConvert.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这个字段
总之还是希望数据传输类里面方法都不要有,只有数据本体等,
辅助方法可以另写一个类。