反序列化json对象时的异常

时间:2015-03-06 02:20:04

标签: c# json parsing

我试图将一些简单的json反序列化为以下对象

    public class Car
    {
        public int car_id { get; set; }
        public string name { get; set; }
    }

    public class RootObject
    {
        public List<Car> cars { get; set; }
    }

这是我的电话

 using (var client = new HttpClient(handler))
                {

                    client.BaseAddress = new Uri("http://localhost/WebApiServer/Reference/");

                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


                    HttpResponseMessage response = client.GetAsync("cars").Result;
                    if (response.IsSuccessStatusCode)
                    {
                        HttpContent httpContent = response.Content;
                        string responseString = httpContent.ReadAsStringAsync().Result;
//error happens here
                        var deserializeObject = JsonConvert.DeserializeObject<RootObject>(responseString);
                    }

这是VS中调试器的响应字符串的值

"\"{ \\\"cars\\\": [{\\\"car_id\\\":46,\\\"name\\\":\\\"Ford-Fiesta\\\"]}}\""

这是例外

//例外

 Error converting value "{ "cars": [{"car_id":46,"name":"Ford-Fiesta"]}}" to type 'WebApiJson.Program+RootObject'. Path '', line 1, position 62.

这是json - 我正在从文件中读取它

 { "cars": [{"car_id":46,"name":"Ford-Fiesta"}]}

我已经没有想法了

编辑:

我刚试过

 string serializeObject = JsonConvert.SerializeObject(text);
    var deserializeObject = JsonConvert.DeserializeObject<RootObject>(serializeObject); 

它给了我同样的问题

编辑2 我的控制器返回json

 public string Cars()
        {
            string text = System.IO.File.ReadAllText("json.txt");

            string serializeObject = JsonConvert.SerializeObject(text);

            Debug.WriteLine(serializeObject);
//            this fails
            var deserializeObject = JsonConvert.DeserializeObject<RootObject>(serializeObject);

            return JsonConvert.SerializeObject(text);
        }

1 个答案:

答案 0 :(得分:0)

              string text = System.IO.File.ReadAllText("json.txt");

                //this line is WRONG!!
                string serializeObject = JsonConvert.SerializeObject(text);

                //this fails because serializeObject is a double serialized string
               //which you try to deserialize to RootOject                
                 var deserializeObject = JsonConvert.DeserializeObject<RootObject>(serializeObject);

                    return JsonConvert.SerializeObject(text);

您正在将字符串序列化为字符串。

 string serializeObject = JsonConvert.SerializeObject(text);

这是错误的,你应该反序列化为一个对象。

RootObject obj = JsonConvert.DeserializeObject<RootObject>(text);

这就是你的Deserialize失败的原因,因为你将你的初始json序列化为第二个字符串,然后尝试将它反序列化为RootObject。

你的控制器应该读这样的东西

  public RootObject Cars()
            {
                string text = System.IO.File.ReadAllText("json.txt");


                RootObject serializeObject = JsonConvert.DeserializeObject<RootObject>(text);

              return serializeObject;
            }