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 =&gt; someField; ;) @derHugo 我建议使用市场上的免费 Json.Net 扩展,内置的 Unity Json 非常乏味(基本上只能处理原语 iirc)。至少,这给了我很多问题。并感谢您的提示! 我提到它是因为你只在你的类中使用基本类型;) 【参考方案1】:

原来你需要一个 setter 来设置属性的值,谁知道呢? ;)

【讨论】:

以上是关于Json.net反序列化不反序列化所有属性的主要内容,如果未能解决你的问题,请参考以下文章

WebAPI 2不反序列化List POST请求中FromBody对象的属性

XMLSerializer 不反序列化 XML

在不反序列化的情况下操作 JSON

JSON.net 反序列化对象嵌套数据

Xamarin REST Web 服务不反序列化

使属性反序列化但不使用 json.net 序列化