使用JSON.NET反序列化JSON数据

时间:2014-08-06 15:57:28

标签: c# json.net

我在使用API​​时遇到问题,第一次使用API​​时。我已经设法使用GET来读取我需要的数据并且该部分工作正常,现在我需要反序列化我要回的JSON数据,并且我使用的是Newtonsoft的JSON .NET库。当我将数据反序列化为爆炸并且调试器没有帮助时,问题似乎就出现了。我在网上尝试了一些建议,但没有去,所以如果有人能够启发我就会受到赞赏。这是代码:

 string url = "";
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 Stream receiveStream = response.GetResponseStream();
 StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);

 string responseData = readStream.ReadToEnd();

 var results = JsonConvert.DeserializeObject<dynamic>(responseData);
 var id = results["id"].Value;
 // var name = results.Name;

当我运行它时,调试器会在最后一行代码中抛出以下异常:

  

{“使用无效键值访问JArray值:\”id \“。期望数组位置索引。”}

我很确定我回来的数据中存在ID。

我从Smarty Streets回来的Json数据:

 [
{
    "id": 0,
    "candidate_index": 0,
    "delivery_line_1": "1600 Amphitheatre Pkwy",
    "last_line": "Mountain View CA 94043-1351",
    "delivery_point_barcode": "940431351000",
    "components": {
        "primary_number": "1600",
        "street_name": "Amphitheatre",
        "street_suffix": "Pkwy",
        "city_name": "Mountain View",
        "state_abbreviation": "CA",
        "zipcode": "94043",
        "plus4_code": "1351",
        "delivery_point": "00",
        "delivery_point_check_digit": "0"
    },
   ]

3 个答案:

答案 0 :(得分:2)

您的回复是一个数组而不是一个对象。所以你应该使用

JArray results = JArray.Parse(responseData)

解析结果(如results[0]["id"])。如果你采取动态的方式,那么

dynamic results = JArray.Parse(responseData)

现在,您可以像results[0].id

一样使用它

答案 1 :(得分:1)

另一个选择是&#34;粘贴JSON作为类&#34;因此可以快速简便地进行反序列化。

  1. 只需复制整个JSON
  2. 即可
  3. 在VS中:点击修改&gt;选择性粘贴&gt; 将JSON粘贴为类
  4. 这是一个更好的解释n piccas ... https://blogs.msdn.microsoft.com/webdev/2012/12/18/paste-json-as-classes-in-asp-net-and-web-tools-2012-2-rc/

答案 2 :(得分:0)

您的结果似乎是一个对象数组,而不是数组本身。尝试将id设置为results["id"][0].Value并查看是否有所收获。

请参阅:Accessed JArray values with invalid key value: "fields". Array position index expected