【问题标题】:C# AdaptiveCards 1.2.4 problems with deserialization of simple cardC# AdaptiveCards 1.2.4 简单卡片反序列化的问题
【发布时间】:2020-08-13 05:30:24
【问题描述】:

我正在使用来自 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

【问题讨论】:

    标签: c# deserialization microsoft-teams adaptive-cards


    【解决方案1】:

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

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

    我们看到唯一的区别是

    有问题:

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

    工作:

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

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

    希望这会有所帮助。

    【讨论】:

    • 谢谢,确实没有看到空洞的事实。虽然这张卡片对设计师来说看起来很有效,而且有点奇怪:)
    • 其实,只有一个 ColumnSet,事实:[] 似乎不是必需的。它成功反序列化。问题似乎与 AdaptiveCards 如何使用 Json.Net 反序列化更相关(可能自定义转换器在反序列化第一个 ColumnSet 时出错,然后在反序列化第二个时得到另一个错误,我认为这个错误是由这个事实引起的)。
    • 在遍历 AdaptiveCards 存储库并检查了它们的序列化程序后,我得出了相同的结论。打的不好:D
    猜你喜欢
    • 2017-06-19
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多