我正在尝试反序列化一些包含接口列表的复杂json(使用扩展JsonConverter的自定义转换器)。这些列表需要填充实现这些接口的类实例。
其中一些类实例也有自己的List<IInterface>
成员来反序列化。这是这个json的片段(为简洁起见省略/改变了部分)。这个json是有效的,我对它的结构没有任何控制权。如果重要的话,它是使用Jackson解析器(服务器端用Java实现)制作的。
Features
是我正在尝试反序列化的更大对象的成员。
"features": {
"features": [
{
"@class": "com.company.project.business_logic.StandardFeatureArtifact",
"feature_number": 1,
"weight": 1,
"player_bool": false,
"override_bool": false,
"play_bool": false,
"evaluates_bool": false,
"result_bool": false,
"runners": [
{
"@class": "com.company.project.business_logic.StandardRunnableFeatureArtifact",
"components": [
{
"@class": "com.company.project.business_logic.components.GamePlayComponent",
"composition_order": 1,
"behaviours": [
{
"@class": "com.company.project.business_logic.behaviours.MultiplierBehaviour",
"order": 2,
"weight": 1,
"multiplier": 1
},
{
"@class": "com.company.project.business_logic.behaviours.RepeatActionBehaviour",
"order": 1,
"weight": 1,
"times_to_run": 8
},
{
"@class": "com.company.project.business_logic.behaviours.SymbolBehaviour",
"order": 0,
"weight": 1,
"symbol_to_fill": "STRING"
}
}
}
}
功能是List<IFeature>
跑步者是List<IRunnableFeature>
组件是List<IRunnableComponent>
行为是List<IBehaviour>
我为以上4个成员列表中的每一个编写了自定义JsonConverters。这是我的一个自定义JsonConverters
的片段class StandardFeatureArtifactConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(StandardFeatureArtifact));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray jo = JArray.Load(reader);
StandardFeatureArtifact sfa = new StandardFeatureArtifact();
sfa.Runners = new List<IRunnableFeature>();
foreach (JObject jobj in jo)
{
if (jobj["@class"].ToString().EndsWith("StandardRunnableFeatureArtifact"))
{
StandardRunnableFeatureArtifact srfa = jobj.ToObject<StandardRunnableFeatureArtifact>(serializer);
sfa.Runners.Add(srfa);
}
}
return sfa;
}
我的WriteJson()
此刻只抛出一个NotImplementedException()
,因为我只是首先专注于反序列化。
所以这就是问题所在。我可以很好地反序列化到return sfa
行。我得到一个有效的StandardFeatureArtifact
对象,但我的行为定制转换器永远不会被执行,当上面的ReadJson()
方法返回时,我得到一个JsonSerializationException {"Error setting value to 'Runners' on 'Company.JSON.StandardFeatureArtifact'."}
。
上述异常发生在我FeatureConverter
的{{1}}课程的以下行中(除了ReadJson()
ReadJson()
之外的jo
非常相似是FeatureConverter
)
JObject
这没有任何意义,因为当我踩过StandardFeatureArtifact sfa = jobj.ToObject<StandardFeatureArtifact>(serializer);
行时,sfa是一个有效的对象。
我很肯定我正在正确地注释和实现转换器,因为我有另一个return sfa
成员(对于List<Interface>
所属的同一外部对象),我正确地反序列化。它与Features
之间的区别在于前者只有原始类型的成员。
我对嵌套json反序列化的理解是每个成员都以“深度优先”方式反序列化。此订单似乎适用于Features
,但features -> StandardFeatureArtifact -> StandardRunnableFeatureArtifact -> GamePlayComponent
已中断。
如果需要更多信息,请与我们联系。这是我关于SO的第一篇文章。谢谢!