如何将 JSON 返回反序列化为从 RestSharp 调用到 API 的对象数组?

Posted

技术标签:

【中文标题】如何将 JSON 返回反序列化为从 RestSharp 调用到 API 的对象数组?【英文标题】:How to deserialize a JSON return into an array of objects from a RestSharp call to an API? 【发布时间】:2016-07-27 15:54:07 【问题描述】:

我正在尝试反序列化从 RestSharp 调用返回到 API 的 JSON。

这是一个 C# 控制台应用程序。到目前为止,这是我的代码:

using System;
using RestSharp;
using RestSharp.Authenticators;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using RestSharp.Deserializers;
using System.Collections.Generic;

namespace TwilioTest

    class Program
    
        static void Main(string[] args)
        
            var client = new RestClient("https://api.twilio.com/2010-04-01");
            var request = new RestRequest("Accounts/Account Sid/Messages.json", Method.GET);
            request.AddParameter("To", "phone number");
            request.AddParameter("From", "phone number");
            client.Authenticator = new HttpBasicAuthenticator("account sid", "auth token");
            var response = client.Execute(request);
            var jsonResponse = JsonConvert.DeserializeObject(response.Content);
            Console.WriteLine(jsonResponse);
        
    

响应是 JSON 格式的消息列表,键包括 "to""from""body""status"。看起来是这样的:


  "to": "phone number",
  "from": "phone number",
  "body": "Sent from your Twilio trial account - Message 1!",
  "status": "delivered"
,

  "to": "phone number",
  "from": "phone number",
  "body": "Sent from your Twilio trial account - Message 2",
  "status": "delivered"
,

我想将其转换为 Message 对象数组,其中 Message 类如下所示:

class Message

    public string To  get; set; 
    public string From  get; set; 
    public string Body  get; set; 
    public string Status  get; set; 

我一直在寻找如何将 JSON 转换为对象并找到此页面:http://blog.atavisticsoftware.com/2014/02/using-restsharp-to-deserialize-json.html。页面上的第三个示例符合我的要求。

我对程序进行了一些更改,现在它看起来像这样:

    class Program
    
        static void Main(string[] args)
        
            // same as above until this point
            ...
            var response = client.Execute(request);
            JsonDeserializer deserial = new JsonDeserializer();
            var messageList = deserial.Deserialize<List<Message>>(response);
            foreach (Message element in messageList)
            
                Console.WriteLine("To: 0", element.To);
                Console.WriteLine("From: 0", element.From);
                Console.WriteLine("Body: 0", element.Body);

            
            Console.ReadLine();
        
    

但是,当我运行程序时,messageList 是空的。将 JSON 响应转换为对象列表我缺少什么? RestSharp Documentation 让它看起来相当简单。

【问题讨论】:

【参考方案1】:

我对RestSharp了解不多,但是你可以这样获取响应内容字符串:

var responseContent = client.Execute(request).Content;

并使用Json.Net 反序列化您的 json 字符串:

JObject jsonResponse = (JObject)JsonConvert.DeserializeObject(response.Content);
var messageList = JsonConvert.DeserializeObject<List<Message>>(jsonResponse["messages"].ToString()‌​);

【讨论】:

我试过了,responseContent 是一个看起来像"key1": "value1", "key2": "value2" ... 的字符串。当程序遇到 DeserializeObject 行时,我收到 JsonSerializationException:“无法将当前 JSON 对象反序列化为类型,因为该类型需要 JSON 数组才能正确反序列化。”我已经尝试了一些我在网上找到的将 JSON 字符串转换为数组的方法,但总是遇到错误。 JSON 中的每个键是否需要在消息类中有一个属性才能正确反序列化? 你能发布json吗? 我想通了 - json 响应有很多属性,其中之一就是消息列表。因此,当我尝试将整个响应反序列化为 Message 对象列表时,它给出了一个错误,因为它不是消息的 JSON 响应。 这是有效的代码:var response = client.Execute(request); JObject jsonResponse = (JObject)JsonConvert.DeserializeObject(response.Content); var messageList = JsonConvert.DeserializeObject&lt;List&lt;Message&gt;&gt;(jsonResponse["messages"].ToString()); @jmk22 好的,因为正文内容已包含在响应中......我将编辑答案

以上是关于如何将 JSON 返回反序列化为从 RestSharp 调用到 API 的对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Json.net 将 JSON 对象反序列化为动态对象

如何将多个键值条目的 JSON 对象反序列化为 Rust 中的自定义结构

如何使用json.net自定义反序列化为对象

c#如何将object类型序列化为二进制存入SQLSERVER中,并从数据库中读出来并反序列化得到object对象

将 JSON 反序列化为 C# 类

如何使用 Jackson 将原始 JSON 反序列化为 Java 对象