C# AdaptiveCards 1.2.4 反序列化简单卡片的问题
C# AdaptiveCards 1.2.4 problems with deserialization of simple card
我使用的是 NuGet 的 AdaptiveCards 1.2.4,反序列化存在一些问题。我能够向下钻取并确定错误的确切来源,并将卡片缩短为 2 列集。该卡是分别与它们一起解析的,但不会同时与它们一起解析。
Exception.Message = "Current error context error is different to requested error."
Exception.StackTrace = " at
Newtonsoft.Json.Serialization.JsonSerializerInternalBase.GetErrorContext(Object currentObject, Object
member, String path, Exception error)
at Newtonsoft.Json.Serialization.JsonSerializerInternalBase.IsErrorHandled(Object currentObject, J
JsonContract contract, Object keyValue, IJsonLineInfo lineInfo, String path, Exception ex)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type
objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings
settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at AdaptiveCards.AdaptiveCard.FromJson(String json)
at AdaptiveCardsDeserializationProblem.Program.Main(String[] args) in
C:\Work\Demo\AdaptiveCardsDeserializationProblem\AdaptiveCardsDeserializationProblem\Startup.cs:line
34"
这是显示问题的示例代码。
try
{
var problematicCard = "{\"type\":\"AdaptiveCard\",\"body\":[{\"type\":\"ColumnSet\",\"spacing\":\"None\",\"columns\":[{\"type\":\"Column\",\"style\":\"default\",\"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]},{\"type\":\"ColumnSet\",\"spacing\":\"None\",\"columns\":[{\"type\":\"Column\",\"style\":\"default\",\"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]}],\"version\":\"1.0\"}";
var firstColumnSet = "{\"type\":\"AdaptiveCard\",\"body\":[{\"type\":\"ColumnSet\",\"spacing\":\"None\",\"columns\":[{\"type\":\"Column\",\"style\":\"default\",\"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]}],\"version\":\"1.0\"}";
var secondColumnSet = "{\"type\":\"AdaptiveCard\",\"body\":[{\"type\":\"ColumnSet\",\"spacing\":\"None\",\"columns\":[{\"type\":\"Column\",\"style\":\"default\",\"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]}],\"version\":\"1.0\"}";
var adaptiveCard = AdaptiveCard.FromJson(problematicCard);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
这是卡片的 JSON -> https://pastebin.com/Ud4BZ33g
这就是卡片在自适应卡片设计器中的样子
诊断 serialization/deserialization 问题的最佳方法是自己填充对象并将其序列化以查看它会生成什么 json 内容。我们期望相同的 json 反序列化回来,没有错误。
在这种情况下,我们填充确切的对象,并使用 ToJson()
方法对其进行序列化。
我们看到唯一的区别是
有问题:
... \"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]} ...
工作:
... \"items\":[{\"type\":\"FactSet\", \"facts\": []}],\"width\":\"stretch\"}]} ...
是的,当更改为包含 facts 空数组时,反序列化会按预期工作。
希望对您有所帮助。
我使用的是 NuGet 的 AdaptiveCards 1.2.4,反序列化存在一些问题。我能够向下钻取并确定错误的确切来源,并将卡片缩短为 2 列集。该卡是分别与它们一起解析的,但不会同时与它们一起解析。
Exception.Message = "Current error context error is different to requested error."
Exception.StackTrace = " at
Newtonsoft.Json.Serialization.JsonSerializerInternalBase.GetErrorContext(Object currentObject, Object
member, String path, Exception error)
at Newtonsoft.Json.Serialization.JsonSerializerInternalBase.IsErrorHandled(Object currentObject, J
JsonContract contract, Object keyValue, IJsonLineInfo lineInfo, String path, Exception ex)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type
objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings
settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at AdaptiveCards.AdaptiveCard.FromJson(String json)
at AdaptiveCardsDeserializationProblem.Program.Main(String[] args) in
C:\Work\Demo\AdaptiveCardsDeserializationProblem\AdaptiveCardsDeserializationProblem\Startup.cs:line
34"
这是显示问题的示例代码。
try
{
var problematicCard = "{\"type\":\"AdaptiveCard\",\"body\":[{\"type\":\"ColumnSet\",\"spacing\":\"None\",\"columns\":[{\"type\":\"Column\",\"style\":\"default\",\"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]},{\"type\":\"ColumnSet\",\"spacing\":\"None\",\"columns\":[{\"type\":\"Column\",\"style\":\"default\",\"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]}],\"version\":\"1.0\"}";
var firstColumnSet = "{\"type\":\"AdaptiveCard\",\"body\":[{\"type\":\"ColumnSet\",\"spacing\":\"None\",\"columns\":[{\"type\":\"Column\",\"style\":\"default\",\"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]}],\"version\":\"1.0\"}";
var secondColumnSet = "{\"type\":\"AdaptiveCard\",\"body\":[{\"type\":\"ColumnSet\",\"spacing\":\"None\",\"columns\":[{\"type\":\"Column\",\"style\":\"default\",\"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]}],\"version\":\"1.0\"}";
var adaptiveCard = AdaptiveCard.FromJson(problematicCard);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
这是卡片的 JSON -> https://pastebin.com/Ud4BZ33g
这就是卡片在自适应卡片设计器中的样子
诊断 serialization/deserialization 问题的最佳方法是自己填充对象并将其序列化以查看它会生成什么 json 内容。我们期望相同的 json 反序列化回来,没有错误。
在这种情况下,我们填充确切的对象,并使用 ToJson()
方法对其进行序列化。
我们看到唯一的区别是
有问题:
... \"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]} ...
工作:
... \"items\":[{\"type\":\"FactSet\", \"facts\": []}],\"width\":\"stretch\"}]} ...
是的,当更改为包含 facts 空数组时,反序列化会按预期工作。
希望对您有所帮助。