C# AdaptiveCards 1.2.4 проблемы с десериализацией простой карты - PullRequest
0 голосов
/ 29 апреля 2020

Я использую AdaptiveCards 1.2.4 от NuGet, и есть некоторые проблемы с десериализацией. Мне удалось детализировать и определить, откуда возникла ошибка, и сократить карту до двух наборов столбцов. Карта анализируется с ними отдельно, но не с обоими одновременно.

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

А вот так выглядит карта в конструкторе адаптивных карт

This is how the card looks like in the adaptive cards designer

Похоже, что она кидает сюда .. https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalBase.cs#L103

1 Ответ

1 голос
/ 29 апреля 2020

Лучший способ диагностировать проблемы сериализации / десериализации - это заполнить объект самостоятельно и сериализовать его, чтобы посмотреть, какой контент json будет генерироваться. Мы ожидаем, что тот же json будет десериализован обратно, без ошибок.

В этом случае мы заполняем точный объект и сериализуем его, используя метод ToJson().

Мы видим, что Единственное отличие:

Проблематично c:

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

Работает:

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

И да, при изменении на пустой массив фактов работает десериализация, как и ожидалось.

Надеюсь, это поможет.

...