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

这就是卡片在自适应卡片设计器中的样子

这里好像是扔的..https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalBase.cs#L103

诊断 serialization/deserialization 问题的最佳方法是自己填充对象并将其序列化以查看它会生成什么 json 内容。我们期望相同的 json 反序列化回来,没有错误。

在这种情况下,我们填充确切的对象,并使用 ToJson() 方法对其进行序列化。

我们看到唯一的区别是

有问题:

... \"items\":[{\"type\":\"FactSet\"}],\"width\":\"stretch\"}]} ...

工作:

... \"items\":[{\"type\":\"FactSet\", \"facts\": []}],\"width\":\"stretch\"}]} ...

是的,当更改为包含 facts 空数组时,反序列化会按预期工作。

希望对您有所帮助。