C# 重复的序列化和反序列化会创建重复项
大家好,我的json序列化有问题。我正在Unity下使用Json.NET包:我正在搜索一个数据库,在我的应用程序上可编辑,并通过wwwForm和一个php文件存储在我的服务器上。我没有问题去创造它,并把它推到网上。问题是,当我加载它时,数据库的末尾有一个新条目。数据库类如下所示:C# 重复的序列化和反序列化会创建重复项,c#,json,serialization,unity3d,json.net,C#,Json,Serialization,Unity3d,Json.net,大家好,我的json序列化有问题。我正在Unity下使用Json.NET包:我正在搜索一个数据库,在我的应用程序上可编辑,并通过wwwForm和一个php文件存储在我的服务器上。我没有问题去创造它,并把它推到网上。问题是,当我加载它时,数据库的末尾有一个新条目。数据库类如下所示: public class Database { public List<Army> armies { get; set;} public Database() { ar
public class Database {
public List<Army> armies { get; set;}
public Database() {
armies = new List<Army>();
armies.Add (new Army());
}
}
public class Army
{
public string faction { get; set;}
public List<Unit> army { get; set;}
public Army()
{
faction = "RED";
army = new List<Unit>();
army.Add (new Unit());
}
}
public class Unit
{
public string name { get; set;}
public float fissionTimer { get; set;}
public float HP { get; set;}
public int shield { get; set;}
public float strenght { get; set;}
public float movSpeed { get; set;}
public float attackSpeed { get; set;}
public float farmAggro { get; set;}
public int criticPossibility { get; set;}
public int armorPenetration { get; set;}
public bool isContagious { get; set;}
public int contagePossibility { get; set;}
public string imgName {get;set;}
public Unit()
{
name = "standard";
fissionTimer = 8;
HP = 100;
shield = 0;
strenght = 10;
movSpeed = 5;
attackSpeed = 0.1f;
farmAggro = 0.1f;
criticPossibility = 0;
armorPenetration = 0;
isContagious = false;
contagePossibility = 0;
imgName = "Red";
}
public Unit(string _name, float _fissionTimer, float _HP, int _shield, float _strenght, float _movSpeed, float _attackSpeed,
float _farmAggro, int _criticPossibility, int _armorPen, bool _iscontagious, int _contagePos, string _imgName)
{
name = _name;
fissionTimer = _fissionTimer;
HP = _HP;
shield = _shield;
strenght = _strenght;
movSpeed = _movSpeed;
attackSpeed = _attackSpeed;
farmAggro = _farmAggro;
criticPossibility = _criticPossibility;
armorPenetration = _armorPen;
isContagious = _iscontagious;
contagePossibility = _contagePos;
imgName = _imgName;
}
}
有2个军队和2个单位。我哪里做错了?提前感谢发生这种情况的原因是两件事的结合:
Replace
来完成,如下所示:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
var database = JsonConvert.DeserializeObject<Database>(www.text, settings);
JsonSerializerSettings设置=新建JsonSerializerSettings();
settings.ObjectCreationHandling=ObjectCreationHandling.Replace;
var database=JsonConvert.DeserializeObject(www.text,settings);
最好的方法是将JSON.Net配置为将默认值替换为
JsonSerializerSettings jsSettings = new JsonSerializerSettings
{
ObjectCreationHandling = ObjectCreationHandling.Replace,
};
JsonConvert.DeserializeObject<Army>(jsonString, jsSettings);
JsonSerializerSettings jsSettings=新的JsonSerializerSettings
{
ObjectCreationHandling=ObjectCreationHandling.Replace,
};
反序列化对象(jsonString、jsSettings);
如果要在构造函数中添加默认项,请尝试删除它们。但我只添加了一项。我这样测试:Database test=newdatabase()//伪代码test.armies.count=1(正确)serialize-save-load-deserialize(不修改数据库test.arms.count?=2…为什么是2?另请参阅:FWIW我使用哈希集修复了它,因此不允许重复值(在我的例子中是枚举)。Thx很多,我只是删除了每个构造函数上的.add,就解决了它,但你教我json序列化是如何工作的;)有用且很好的回答,再次谢谢
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
var database = JsonConvert.DeserializeObject<Database>(www.text, settings);
JsonSerializerSettings jsSettings = new JsonSerializerSettings
{
ObjectCreationHandling = ObjectCreationHandling.Replace,
};
JsonConvert.DeserializeObject<Army>(jsonString, jsSettings);