在进行类转json字符串时,报错JsonException: Max allowed object depth reached while trying to export from type System.Single。
LitJson实际上是类的属性中有json不能识别的数据类型,这里就是float。什么类型是允许的呢?
在JsonData类中找到了答案。
public JsonData(bool boolean);
public JsonData(double number);
public JsonData(int number);
public JsonData(long number);
public JsonData(object obj);
public JsonData(string str);
所以去掉float,或者 float转成double。
float x1 = 0.01F;
double y = Convert.ToDouble(0.01F);
这时候y会变成0.09999992341……
可以用Math.Round进行四舍五入,或者先将float转为字符串再用double.Parse转成double,避免精度错误。
下面以游戏地图节点位置vector是float类型转为double可存档类型为例说明:
// 地图节点管理器
public class MapNodeManager
{
///
/// 地图节点数据
///
public List MapNodes { private set; get; }
}
// 将要进行存档的内容
class MapNode
{
///
/// 位置
///
public Vector2 LocalPos { private set; get; }
}
// 实际存档的数值
class MapNodeArchive
{
///
/// 位置
///
public Vector2Archive LocalPos;
}
// 存档管理器
class GameArchiveManager
{
Debug.Log("清空存档所有地图列表对象的数据");
ga.List_MapNodesArchives.RemoveAll(j => true);
// 得到manager的save
MapNodeManager mapNodesSave = ManagerController.Instance.MMapNodeManager;
// 得到n列节点的save
List mapNodesColumns = mapNodesSave.MapNodes;
if (mapNodesColumns != null)
{
for (int i = 0; i < mapNodesColumns.Count; i++)
{
Debug.Log(" 得到一列节点的存档");
MapColumnNodeArchive mnal = CreateMapNodeArchiveList(mapNodesColumns[i]);
ga.List_MapNodesArchives.Add(mnal);
}
}
public MapNodeArchive CreateMapNodeArchive(MapNode mapANode)
{
if (mapANode != null)
{
MapNodeArchive asmna = new MapNodeArchive();
asmna.NodeId = mapANode.NodeId;
// 节点位置
asmna.LocalPos = CreateVector3Archive(mapANode.LocalPos);
}
return asmna;
}
return null;
}
public Vector3Archive CreateVector3Archive(Vector2 v2)
{
Vector3Archive v3a = new Vector3Archive();
v3a.x = double.Parse(v2.x.ToString());
v3a.y = double.Parse(v2.y.ToString());
return v3a;
}
}
先将float转为字符串再用double.Parse转成double,避免精度错误
