2014-11-03 107 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的长度的阵列和第三和第四元件是为MyModel的 - 它可能无法反序列化,因为它不能将空数组变成MyModel,将前两个元素设置为'null'而不是'[]' – 2014-11-03 10:59:06

回答

1

首先你JSON的看起来有点错误的我。它是和4个元素的数组,前两个元素是空数组,而另外两个对象?我怀疑你的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>但对于序列化/反序列化,你必须有StringObject类型的关键。

工作实施例(提供从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

这里不起作用 – 2014-11-03 10:13:50

+0

@csprabala我试着用List []和它给我一个大小为2的列表,但空对象列表不起作用,它会抛出一个异常 – 2014-11-03 10:15:04

+0

@PatrickHofman是正确的这赢得了'工作。看看这个。 http:// stackoverflow。com/questions/16015257/why-does-c-sharp-javascriptserializer-serialize-return-empty-square-brackets – csprabala 2014-11-03 10:39:25