2014-11-03 3 views
1

Вот как я пытаюсь десериализации мой JSON:десериализации JSON - неправильный тип

new JavaScriptSerializer().Deserialize<Dictionary<int, MyModel>>(myData); 

Вот класс:

public class MyModel 
{ 
    public Dictionary<int, ItemModel> Translation { get; set; } 

    public int Id { get; set; } 
} 

public class ItemModel 
{ 
    public string Name { get; set; } 

    public string ShortDescription { get; set; } 

    public string LongDescription { get; set; } 
} 

И вот JSON:

"[[],[],{"Translation":{"1":{"Name":"Bla1","ShortDescription":"bla1","LongDescription":"bla1"},"2":{"Name":"BlaUS1","ShortDescription":"BlaUS1","LongDescription":"BlaUS1"}},"Id":"12"},{"Translation":{"1":{"Name":"Bla22","ShortDescription":"bla22","LongDescription":"bla22"},"2":{"Name":"Bla2US2","ShortDescription":"Bla2US2","LongDescription":"Bla2US2"}},"Id":"13"}]" 

и я получаю ошибка, что тип не поддерживается для десериализации массива.

Где моя ошибка?

+0

Вы, кажется, есть массив, где первые два элемента являются 0 длины массивов и третьего и 4-й элементы из MyModel - это, вероятно, не может десериализоваться, так как он не может превратить пустой массив в MyModel, установите первые два элемента в 'null', а не в' [] ' –

ответ

1

Прежде всего ваш JSON выглядит немного неправильно для меня. Это и массив из 4 элементов и 1-й два элемента - это пустые массивы, но два других объекта? Я подозреваю, что ваш JSON должно быть что-то вроде этого:

"[{" Перевод ": {" 1 ": {" Имя ":" Bla1" , "SHORTDESCRIPTION": "bla1", "LongDescription":» bla1 "}," 2 ": {" Имя ":" BlaUS1" , "SHORTDESCRIPTION": "BlaUS1", "LongDescription": "BlaUS1"}}, "Id": "12"}, { "Перевод": { "1": { "Имя": "bla22", "SHORTDESCRIPTION": "bla22", "LongDescription": "bla22"}, "2": { "Имя": "Bla2US2", "SHORTDESCRIPTION": "Bla2US2" "LongDescription": "Bla2US2"}}, "Id": "13"}]»

Другая проблема заключается в том, что у вас есть Dictionary<int, ItemModel> но для сериализации/десериализации вы должны иметь ключ String или Object типа.

Рабочий пример (при условии, что вы изменили от Dictionary<int, ItemModel> к Dictionary<object, ItemModel>):

string input = "[{\"Translation\":{\"1\":{\"Name\":\"Bla1\",\"ShortDescription\":\"bla1\",\"LongDescription\":\"bla1\"},\"2\":{\"Name\":\"BlaUS1\",\"ShortDescription\":\"BlaUS1\",\"LongDescription\":\"BlaUS1\"}},\"Id\":\"12\"},{\"Translation\":{\"1\":{\"Name\":\"Bla22\",\"ShortDescription\":\"bla22\",\"LongDescription\":\"bla22\"},\"2\":{\"Name\":\"Bla2US2\",\"ShortDescription\":\"Bla2US2\",\"LongDescription\":\"Bla2US2\"}},\"Id\":\"13\"}]"; 

List<MyModel> myModels = new JavaScriptSerializer().Deserialize<List<MyModel>>(input); 
0

Ваша строка говорит о том, что то, что у вас есть массив JSON, например: - [1,2,3]

но вы пытаетесь десериализации его в словарь, для которого представление JSON сродни

{"1":"Hai","2":"Hello"} 

Очевидно, библиотека выдает сообщение об ошибке. Может быть, вы не используете следующее для десериализации строки.

new JavaScriptSerializer().Deserialize<List<MyModel>[]>(myData) 

Однако, чтобы использовать его, вы не можете иметь пустые массивы в JSON, вы должны заполнить их значения по умолчанию для свойств.

Чтобы доказать, что вышеуказанные работы, попробуйте

"[{"Translation":{"1":{"Name":"Bla1","ShortDescription":"bla1","LongDescription":"bla1"},"2": {"Name":"BlaUS1","ShortDescription":"BlaUS1","LongDescription":"BlaUS1"}},"Id":"12"},{"Translation":{"1":{"Name":"Bla22","ShortDescription":"bla22","LongDescription":"bla22"},"2":{"Name":"Bla2US2","ShortDescription":"Bla2US2","LongDescription":"Bla2US2"}},"Id":"13"}]" 

с

new JavaScriptSerializer().Deserialize<List<MyModel>>(myData) 
+0

Не работает здесь. –

+0

@csprabala Я попробовал со списком [] и он дает мне список с размером 2, но с пустыми объектами. Список не работает, он выдает исключение. –

+0

@PatrickHofman прав, т работы. Взгляните на это. http: // stackoverflow.com/questions/16015257/why-do-c-sharp-javascriptserializer-serialize-return-empty-square-brackets – csprabala

Смежные вопросы