无法反序列化当前的JSON对象(例如{“name”:“value”})

时间:2015-04-27 12:48:22

标签: c# json json.net

这是我的JSON数据

{
    "logInResult": [
        {
            "Name": "yogesh singh",
            "cityName": "",
            "img": "DefaultImage/D_Vp_Men.png",
            "usrId": "374"
        }
    ]
}

这是我的代码

public async Task<ActionResult> Index()
{

    HttpClient webClient1 = new HttpClient();
    Uri uri = new Uri("http://m.vinipost.com/service/userprofile.svc/logIn?loginId=thyschauhan@gmail.com&pass=12345");

    HttpResponseMessage response1;

    response1 = await webClient1.GetAsync(uri);

    var jsonString = await response1.Content.ReadAsStringAsync();

    var _Data = JsonConvert.DeserializeObject<List<JClass>>(jsonString);
    foreach (JClass Student in _Data)
    {
        ViewBag.Message += Student.Name + ", ";
    }
    dynamic obj = JsonConvert.DeserializeObject(jsonString);
    ViewBag.Message += obj.data.Name;

    return View();
}

,错误是

  

无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List`1 [MvcSumit1.Models.JClass]',因为该类型需要JSON数组(例如[1,2,3])正确反序列化。   要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。   路径'logInResult',第1行,第15位。

5 个答案:

答案 0 :(得分:8)

您应该创建以下类,以便将您的json数据映射到实际的类。

public void UpdatePanel(Panel panel, Button button)
{
    if(panel.InvokeRequired)
    {
        panel.Invoke(new Action<Panel,Button>(UpdatePanel), new object[] {panel, button});
    }
    else
    {
        panel.Controls.Add(button);
    }
}

然后,您可以存储RootObject以进行进一步处理:

    public class LogInResult
{
    public string Name { get; set; }
    public string cityName { get; set; }
    public string img { get; set; }
    public string usrId { get; set; }
}

public class RootObject
{
    public List<LogInResult> logInResult { get; set; }
}

通过使用列表的getter,您可以获取列表并照常迭代它。

答案 1 :(得分:3)

您的问题似乎与以下内容重复:Using JsonConvert.DeserializeObject to deserialize Json to a C# POCO class

您正尝试将JSON 对象反序列化为JSON 数组

仅将logInResult的内容存储到jsonString,即:

[{"Name":"yogesh singh","cityName":"","img":"DefaultImage\/D_Vp_Men.png","usrId":"374"}]

这当然假设您首先确定了JClass

答案 2 :(得分:0)

你的C#代码认为它正在读这个:

[
    {
        "Name": "yogesh singh",
        "cityName": "",
        "img": "DefaultImage/D_Vp_Men.png",
        "usrId": "374"
    }
]

即。一个对象数组,实际上它正在读取一个带有属性logInResult的对象,这是一个数组。

答案 3 :(得分:0)

我遇到了同样的问题,只是想指出当JSON中存在数组或列表时就像在logInResults中是一个类型的列表,所以虽然反序列化JSON转换不能理解,所以你是什么可以用这种方式创建你的模型。

Class  giveName
{
  givenName[] logInResult {get;set;}         // can use list also will work fine
}

public class giveName2
{
   public string Name {get;set;}
   public string cityName {get;set;}
   public string img {get;set;}
   public string usrId {get;set;}
}

我会告诉你为什么因为看到你的json对象的第一个大括号让你工作,你必须创建一个类型(类),它有一个名为logInResult的属性,就像创建列表的对象一样必须提供一个类型,然后提供与列表项匹配的属性

注意:giveName和giveName2是您可以自己给出的名称,与类名

无关

答案 4 :(得分:0)

转换为对象集合

using Newtonsoft.Json.Linq;

JObject obj = JObject.Parse(jsonString);
JArray arr = (JArray)obj["logInResult"];
IList<JClass> student= arr.ToObject<IList<JClass>>();

return View(student);

然后迭代它。

IEnumerable<Student>
  @foreach (var item in Model)
 {
   item.Name
   item.CityName
   item.Img
   item.UsrId
 }