【问题标题】:Convert JSON Response Returning From Resful Web Service转换从 Restful Web 服务返回的 JSON 响应
【发布时间】:2015-12-07 16:14:22
【问题描述】:

我的 RESTFUL Web 服务和我的 Web 应用程序中有这 2 个类

public class Service
{
    public int ID { get; set; }
    public int HCode { get; set; }
    public int HUserID { get; set; }
    public string PatientNID { get; set; }
    public List<Document> DocumentList { get; set; }
    public int ServiceTypeID { get; set; }
    public string TestName { get; set; }
    public string Comment { get; set; }
    public DateTime Date { get; set; }
}

public class Document
{
    public int ID { get; set; }
    public int ServiceID { get; set; }
    public string FileName { get; set; }
    public string Extension { get; set; }
    public byte[] ByteDocument { get; set; }
}

这是网络服务中接收对象并返回列表的功能

public List<Serivce> GetServiceByHUserID(Service service)
    {
        SqlCommand cmd = new SqlCommand(
              "SELECT *"
            + " FROM TransactionHistory"
            + " WHERE UserID = @HUserUserIDParam"
            , con);
        cmd.Parameters.Add(
        "@HUserUserIDParam", SqlDbType.NVarChar).Value = service.HUserID;

        return GetServiceResponse(cmd);
    }

private List<Service> GetServiceResponse(SqlCommand cmd)
    {
            List<Service> serviceList = new List<Service>();
        try
        {
            // Filling Data
              ....
        }
            return serviceList;
        }
        catch (Exception e) { return null; }
        finally { con.Close(); }
    }

这是web app中发送对象和接收列表的功能

private List<Service> GetServiceListResponse(HttpWebRequest request
        , Service service)
    {
        try
        {
            var json = new JavaScriptSerializer().Serialize(service);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.ContentLength = json.Length;
            StreamWriter requestWriter = new StreamWriter(request.GetRequestStream(),
                System.Text.Encoding.ASCII);
            requestWriter.Write(json);
            requestWriter.Close();

            WebResponse webResponse = request.GetResponse();
            Stream webStream = webResponse.GetResponseStream();
            StreamReader responseReader = new StreamReader(webStream);
            string response = responseReader.ReadToEnd();
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            // ERROR HERE
            dynamic item = serializer.Deserialize<List<Service>>(response);
            // ERROR HERE
            responseReader.Close();
            return item;
        }
        catch (Exception e) { return null; }
    }

当我尝试将 List<.service> 作为 JSON 对象返回并对其进行反序列化时,我得到了那个错误

这是个例外

无法将“System.String”类型的对象转换为“System.Byte[]”类型

【问题讨论】:

  • 有什么原因你不能使用自动为你处理所有这些的 .NET HttpClient 库吗?
  • 这是我第一次创建 Web 服务,所以我不知道所有的方法。我可能会搜索并尝试一下。感谢你的回复。 @ErikFunkenbusch

标签: c# asp.net json web-services


【解决方案1】:

我找到了一个解决方案

这只是改变了我在序列化和反序列化中使用的类(.NET 中的内置类,称为 JavaScriptSerializer

JavaScriptSerializer() 到 JsonConvert

在 Github 上发布:https://github.com/JamesNK/Newtonsoft.Json/releases

NuGut 上的最新包:Install-Package Newtonsoft.Json

Newtonsoft 网站:http://www.newtonsoft.com/json

引用dll或者下载包后,在代码里面(.cs类里面)引用dll:

using Newtonsoft.Json;

其他参考资料:

using System.IO;
using System.Text;

发送前序列化json对象,使用UTF8编码:

string json = JsonConvert.SerializeObject(service);
request.Method = "POST";
request.Method = "POSt";
request.ContentType = "application/json";
request.ContentLength = Encoding.UTF8.GetByteCount(json);
StreamWriter requestWriter = new StreamWriter(request.GetRequestStream(), new UTF8Encoding(false));
requestWriter.Write(json);
requestWriter.Close();

在得到响应后反序列化 json 对象:

List<Service> serviceList = JsonConvert.DeserializeObject<List<Service>>(response);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 2012-01-09
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多