【发布时间】:2019-02-23 18:36:32
【问题描述】:
我正在处理一个项目,该项目在 JSON 中有一些非常复杂的配置文件。一个例子是这样的(只是一个更大的 cog 中的一个属性)
"Visuals": {
"UseAnimation": [
{
"Name": "idle",
"RunConditions": {
"cur_processed_inv": "IsZero"
}
},
{
"Name": "running",
"RunConditions": {
"cur_processed_inv": "IsGreaterThanZero"
}
}
]
}
项目决定使用 Newtonsoft.Json 进行转换。当前的结构方式是一系列类。在这种情况下,Visuals 和 UseAnimation 是类。 RunConditions 由一个名为 Conditions 的类管理,目前看起来像这样:
[Serializable]
[JsonObject(MemberSerialization.OptIn)]
public class Conditions
{
public List<ParameterCondition> ParamConditions { get; set; }
}
问题是json数据与类结构不匹配。造成这种情况的原因很复杂,但简短的版本是过去基于 XML 的代码,而且在转换为 JSON 时似乎从未正确测试过这一位。如果可能的话,我不想改变数据文件,也不想改变最终保存数据的结构。理想的解决方案是制作一些可以自定义解析这个类的代码,该类由正在运行的 JSON 反序列化代码调用,如下所示:
public static Conditions Deserialize(JToken jtoken)
{
Conditions condition = new Conditions();
condition.ParamConditions = new List<ParameterCondition>();
foreach (JProperty prop in jtoken)
{
ConditionType type = (ConditionType)Enum.Parse(typeof(ConditionType), prop.Value.ToString(), true);
condition.ParamConditions.Add(new ParameterCondition()
{
Condition = type,
ParameterName = prop.Name
});
}
return condition;
}
环顾四周,我看到了您可以完全自定义反序列化所有内容的解决方案,但我只想反序列化这一块。
这是针对名为Project Porcuipine 的开源游戏。一些可能有帮助的位:
【问题讨论】:
-
如果您已经在使用 Newtonsoft.Json,那么您可以为您的
Conditions类型编写自定义 JsonConverter/JsonConverter(如果需要,还可以为您的其他类型编写进一步的自定义 JsonConverter) .在 StackOverflow、Newtonsoft.Json 文档和互联网上四处看看;有很多关于 JsonConverter 的文章可供您利用和学习...... -
据我所知,如果您只是尝试反序列化条件,那么它就足够了。我还没有找到一个关于如何使用 JsonConverter 反序列化 JSON 结构的一部分的示例,尽管我可能只是想念如何使它工作。
-
使用一个单独的类来代表你想要的输出结构,然后看看实现
-
好的,我想我找到了丢失的那一块,现在它似乎可以工作了。谢谢!
标签: c# json serialization