首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON Restful服务。无法从System.String转换或转换为System.Collections.Generic.List

JSON Restful服务。无法从System.String转换或转换为System.Collections.Generic.List
EN

Stack Overflow用户
提问于 2014-09-04 00:22:28
回答 1查看 10.3K关注 0票数 1

我在序列化和反序列化json时遇到了问题。我一直在寻找答案,虽然我在其他地方也看到了同样的问题,但没有一个答案对我有帮助。我在使用newtonsoft或javascriptserializer时也遇到了同样的问题。

我在rest服务中的web方法

代码语言:javascript
复制
[OperationContract(Name="Customers")]
[WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "json/Customer/Read/{CustomerID}/{CustomerCode}/{ParentCustomerID}/{CustomerName}")]
String JSONReadCustomers(String CustomerID, String CustomerCode, String ParentCustomerID, String CustomerName);

这个类

代码语言:javascript
复制
public class Customer
{
    public Int32 CustomerID { get; set; }
    public String CustomerCode { get; set; }
    public String CustomerName { get; set; }
    public Customer(DataRow DR)
    {
        CustomerID = Convert.ToInt32(DR["CustomerID"]);
        CustomerCode = (DR["CustomerCode"] != null) ? DR["CustomerCode"].ToString() : "";
        CustomerName = (DR["CustomerName"] != null) ? DR["CustomerName"].ToString() : "";
    }
}

实际执行序列化的位

代码语言:javascript
复制
private String GetJSON(DataTable DT)
{
    try
    {
        List<Customer> customers = new List<Customer>();
        foreach (DataRow DR in DT.Rows)
        {
            customers.Add(new Customer(DR));
        }

        return JsonConvert.SerializeObject(customers);
    }
    catch
    {
        throw;
    }
}

到目前为止,一切似乎都很好。服务编译并运行正常。当我在浏览器中测试它时,我得到了以下结果

代码语言:javascript
复制
"[{\"CustomerID\":1,\"CustomerCode\":\"AMT-1\",\"CustomerName\":\".AMTDisp\"},{\"CustomerID\":2,\"CustomerCode\":\"COM-2\",\"CustomerName\":\".ComexDisp,_\"}]"

我使用了一个VB测试工具,调用rest服务并反序列化返回的json

班级

代码语言:javascript
复制
Public Class Customer
    Public CustomerID As Int32
    Public CustomerCode As String
    Public CustomerName As String
End Class

该方法

代码语言:javascript
复制
Private Function DeserializeJSON() As List(Of Customer)

    Dim request As WebRequest = WebRequest.Create(GetCustomerURL())
    request.Credentials = CredentialCache.DefaultCredentials
    Dim response As WebResponse = request.GetResponse()
    Dim dataStream As Stream = response.GetResponseStream()

    Dim reader As New StreamReader(dataStream)
    Dim responseJSON As String = reader.ReadToEnd()

    Dim customers As List(Of Customer) = JsonConvert.DeserializeObject(Of List(Of Customer))(responseJSON)
    Return customers

End Function

错误

代码语言:javascript
复制
{"Could not cast or convert from System.String to System.Collections.Generic.List`1[RESTTestHarness.Customer]."}

我使用了各种不同的方法,比如将bodystyle设置为包装,以及设置一个根对象。似乎什么都不起作用。我总是得到相同的错误。我相信这里的错误真的很简单,但我现在看不到它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-04 00:44:31

如果您想返回一个通用的json响应,您需要更改您的服务操作契约,以返回消息而不是字符串。

然后,您的服务操作实现应该如下所示:

代码语言:javascript
复制
public System.ServiceModel.Channels.Message CreateJsonResponse()
{
  List<Customer> response = GetCustomers(); 

  string msg = JsonConvert.SerializeObject(response);

  return WebOperationContext.Current.CreateTextResponse(msg, "application/json; charset=utf-8", Encoding.UTF8);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25649221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档