2016-12-07 1 views
5

Невозможно десериализовать динамический список, содержащий логическое свойство, обратно в логическое.
У меня есть следующий json.Newtonsoft Json deserialize to dynamic list with boolean свойство превращается в строку

[ 
    { 
    "Field1": 1, 
    "Field2": "Test 1", 
    "Field3": true 
    }, 
    { 
    "Field1": 2, 
    "Field2": "Test 2", 
    "Field3": false 
    } 
] 

Когда я использую:

Newtonsoft.Json.JsonConvert.DeserializeObject<List<dynamic>>(jsonString) 

Я получаю Field3 = «True» или «False»
При привязке к сетке или другой элемент управления, он считает, что это «строка» и не «булево».

Любые предложения?

+1

Скорее всего, цифры тоже строки, только вы не видите этого в своем выходе. Было бы разумно, что если вы не расскажете JSON.NET о том, какие свойства должны быть, не давая ему модель, это будет думать, что вам все равно. – krillgar

+0

Я только что проверил быстрый тест только с десериализацией, и я думаю, что проблема, которую вы цитируете, связана с этапом привязки, а не с шагом десериализации. Захватите вывод из DeserializeObject и проверьте его. Это булевский тип. Я думаю, что значение будет принудительно введено в строку позже. – dviljoen

+0

Возможно, вы правы, но когда я привязываю его к сетке, он думает, что это строка, но если я изменю на , он думает, что это логическое значение. Я 99.99% уверен, что это я делаю что-то неправильное. ;) – goroth

ответ

1

Так что я попытался установить LINQPad и выяснить, почему он работал на vendettamit пока она не работала в моей C# приложение.
Который привел меня к этой статье на How to Dump a Newtonsoft JObject in LinqPad.

Тогда я заметил, что rdavisau использовал следующий код.

JsonConvert.DeserializeObject<ExpandoObject>(jsonString) 

Однако я использовал следующий код.

JsonConvert.DeserializeObject<List<dynamic>>(jsonString) 

Итак, как только я изменил свой код на следующее. Все работало правильно.

JsonConvert.DeserializeObject<List<ExpandoObject>>(jsonString) 

ExpandoObject был частью, которую мне не хватало.

2

Поскольку в JSON значение true is bool and "true" is string, это похоже на ошибку. Для этого я бы создал новую проблему для своих issue tracker.

Обходным решением было бы создать для него сильную типизированную модель.

public class FieldData 
{ 
    public int Field1 {get; set;} 
    public string Field2 {get; set;} 
    public bool Field3 {get; set;} 
} 

JsonConvert.DeserializeObject<List<FieldData>>(jsonString); 

Это также имеет преимущество проверки соответствия и лучшей производительности во время выполнения.

+0

Я рассмотрю вопрос трекера. Я согласен с тем, что строго типизированное было бы замечательно, но данные json поступают из веб-службы и динамичны по своей природе. – goroth

0

Я просто попытался реплицировать ваш код, как в LINQPAD, с JSON.NET 9.0.1. Я не видел этот вопрос там:

enter image description here

+0

У меня нет премии LinqPad, поэтому я не могу отлаживать, чтобы увидеть, что вы указали выше. Но в моем приложении C# с использованием JSON.NET 9.0.1 это не отображается как логическое. Когда я databind вывод, он является только обязательным как строка. – goroth

0

Я просто побежал:


string s = "[{ \"Field1\": 1, \"Field2\": \"Test 1\", \"Field3\": true }, { \"Field1\": 2, \"Field2\": \"Test 2\", \"Field3\": false } ]"; 
var result = JsonConvert.DeserializeObject>(s); 
Console.WriteLine("Type: {0}", result[0].Field3.Type); 

и он дал мне: Тип: Boolean

Проблема, скорее всего, потому что JValue является принуждают в строку во время связывания.