Json.net反序列化不反序列化所有属性
Posted
技术标签:
【中文标题】Json.net反序列化不反序列化所有属性【英文标题】:Json.net Deserialization not deserializing all properties 【发布时间】:2021-05-26 05:43:12 【问题描述】:我遇到了一个奇怪的问题,当我使用 JsonConvert.SerializeObject(Unity 的 Json.Net 的一部分)序列化我的一个类时,基于输出的反序列化似乎跳过了一些属性。比如这段代码:
JSonModifier healthMod = new JSonModifier("PlayerMain", "Health", "BaseAdd", 1f);
JSonModifierSkill jMod = new JSonModifierSkill(healthMod, "Staunch Warrior", 5, new string[0], new string[0]);
Debug.Log(JsonConvert.SerializeObject(jMod));
File.WriteAllText(jsonLocation, JsonConvert.SerializeObject(jMod));
Debug.Log(File.ReadAllText(jsonLocation));
JSonModifierSkill swJmod = JsonConvert.DeserializeObject<JSonModifierSkill>(File.ReadAllText(jsonLocation));
swJmod.Print();
ModifierSkill StaunchWarrior = swJmod.GetModifierSkill();
Debug.Log(StaunchWarrior.skillName + " " + StaunchWarrior.MaxLevel + " " + StaunchWarrior.skillModifier.valueType + " " + StaunchWarrior.locked + " " );
产生以下输出: "skillName":"Staunch Warrior","MaxLevel":5,"statRequirements":[],"skillPrerequisites":[],"modifier":"type":"PlayerMain","valueType":"Health" ,"ModEffect":"BaseAdd","value":1.0
"skillName":"Staunch Warrior","MaxLevel":5,"statRequirements":[],"skillPrerequisites":[],"modifier":"type":"PlayerMain","valueType": "健康","ModEffect":"BaseAdd","value":1.0 PlayerMain Health BaseAdd 1 5 System.String[] 5 baseAdd False 以下是相关类:
class JSonModifier
public string type;
public string valueType;
public string ModEffect;
public float value;
public JSonModifier(string _type, string _valueType, string _modEffect, float _value)
type = _type;
valueType = _valueType;
ModEffect = _modEffect;
value = _value;
public void Print()
Debug.Log(type + " " + valueType + " " + ModEffect + " " + value);
public Modifier GetModifier()
ModifierType modType;
ModifierValueType modValType;
PlayerMainModEffect modEffect;
Enum.TryParse(type, out modType);
Enum.TryParse(valueType, out modValType);
Enum.TryParse(ModEffect, out modEffect);
return new Modifier(modType, modEffect, modValType, value);
class JSonModifierSkill
[JsonProperty(Order = 1)]
public string skillNameget;
[JsonProperty(Order = 2)]
public int MaxLevelget;protected set;
[JsonProperty(Order = 3)]
public String[] statRequirements;
[JsonProperty(Order = 4)]
public String[] skillPrerequisites get;
[JsonProperty(Order = 5)]
public JSonModifier modifier;
public JSonModifierSkill(JSonModifier _modifier, string _skillName, int __maxLevel, String[] statReq, String[] skillReq)
modifier = _modifier;
skillName = _skillName;
MaxLevel = __maxLevel;
statRequirements = statReq;
skillPrerequisites = skillReq;
public void Print()
modifier.Print();
Debug.Log(skillName + " " + MaxLevel + " " + statRequirements + " " + skillPrerequisites);
public ModifierSkill GetModifierSkill()
Modifier mod = new Modifier(ModifierType.PlayerMain, PlayerMainModEffect.Health, ModifierValueType.baseAdd, 1f);
//modifier.Print();
//mod = modifier.GetModifier();
return new ModifierSkill(skillName, MaxLevel, mod);
我真的很难过,因为 JSonModifier、statRequirements 和 MaxLevel 属性似乎可以很好地反序列化,而且我没有收到任何错误,但是 SkillName 和 SkillPrerequisistes 消失了? 希望有人能告诉我哪里出错了。谢谢!
【问题讨论】:
原来你需要一个 setter 来设置属性的值,谁知道呢? ;) 对于您正在使用的数据,您可以简单地使用内置的JsonUtility
.. 我会确保创建类[Serializable]
并使用字段而不是属性。如果您想要只读访问权限,请执行 [SerializeField] private string someField; public string SomeField => someField;
;)
@derHugo 我建议使用市场上的免费 Json.Net 扩展,内置的 Unity Json 非常乏味(基本上只能处理原语 iirc)。至少,这给了我很多问题。并感谢您的提示!
我提到它是因为你是只在你的类中使用基本类型;)
【参考方案1】:
原来你需要一个 setter 来设置属性的值,谁知道呢? ;)
【讨论】:
以上是关于Json.net反序列化不反序列化所有属性的主要内容,如果未能解决你的问题,请参考以下文章