无法将当前的JSON数组(例如[1,2,3])反序列化为类型

57

我有一个像这样的类:

public class MyStok
{
    public int STId { get; set; }
    public int SM { get; set; }
    public string CA { get; set; }
    public string Br { get; set; }
    public string BNo { get; set; }
    public decimal Vat { get; set; }
    public decimal Price { get; set; }
}

我这样反序列化:

string sc = e.ExtraParams["sc"].ToString();
MyStok myobj = JSON.Deserialize<MyStok>(sc);

我的输出看起来像这样(string sc)在 fiddler 上:

[
    {
        "STId": 2,
        "CA": "hbh",
        "Br": "jhnj",
        "SM": 20,
        "Vat": 10,
        "Price": 566,
        "BNo": "1545545"
    }
]

但我收到了以下错误:

无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 [...]

那段代码有什么问题?

5个回答

112

看起来字符串中包含一个只有一个MyStok对象的数组。如果你从输入的两端删除方括号,你应该可以将数据反序列化为单个对象:

MyStok myobj = JSON.Deserialize<MyStok>(sc.Substring(1, sc.Length-2));

你也可以将数组反序列化为一个由 MyStok 对象组成的列表,并取索引零上的对象。
var myobjList = JSON.Deserialize<List<MyStok>>(sc);
var myObj = myobjList[0];

28

针对数组类型,请尝试这个。

 List<MyStok> myDeserializedObjList = (List<MyStok>)Newtonsoft.Json.JsonConvert.DeserializeObject(sc, typeof(List<MyStok>));

点击此处了解如何反序列化Json


非常感谢您的示例,您救了我的一天...我错过了使用List Of的重点。 - Marçal Torroella
这种方法真的非常完美......谢谢!! - MD. RAKIB HASAN

2
如果您有一个没有名称的根级数组,并且您实际上想要将其用于某些操作,例如添加方法,则可以选择另一种方法。
public class MyStoks : List<MyStok> 
{

}

然后你可以像这样反序列化。
MyStoks myObj = JsonConvert.DeserializeObject<MyStoks>(jsonString);

这对我来说是一种更优雅的解决方案。您无需将其反序列化为列表,因为该列表已构建到 JSON 对象类中。 - Bullfrog Software

1
我遇到了完全相同的错误信息。我尝试了Aditi的示例,然后意识到真正的问题所在。(因为我有另一个apiEndpoint进行了类似的调用,它可以正常工作。)在这种情况下,我的列表中的对象尚未从中提取出接口。所以因为我显然错过了一步,当它去绑定时就会出现问题。
List<OfthisModelType>

它无法反序列化。

如果您遇到此问题,请检查是否可能是该问题。


-1
HttpClient webClient = new HttpClient();
Uri uri = new Uri("your url");
HttpResponseMessage response = await webClient.GetAsync(uri)
var jsonString = await response.Content.ReadAsStringAsync();
var objData = JsonConvert.DeserializeObject<List<CategoryModel>>(jsonString);

这并没有为问题或其他答案增加任何价值。 - infl3x
如果您使用HttpClient调用,则可以将其标记为有用的答案,因为最后一行包含答案,即将其反序列化为类列表JsonConvert.DeserializeObject<List<CategoryModel>>(jsonString);。 - khaled Dehia
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。一个适当的解释将极大地提高其长期价值,因为它可以展示为什么这是一个好的问题解决方案,并使其对未来读者有其他类似问题的人更有用。请[编辑]您的答案以添加一些解释,包括您所做的假设。 - jasie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接