JSON Restful сервис. Не удалось привести или преобразовать из System.String в System.Collections.Generic.List

1

У меня проблема сериализации и десериализации json. Я искал ответ, и хотя я видел ту же проблему в другом месте, не ответы помогли мне. У меня такая же проблема с использованием newtonsoft или javascriptserializer.

Мой веб-метод в службе отдыха

[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);

Класс

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() : "";
    }
}

бит, который фактически выполняет сериализацию

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;
    }
}

Пока все выглядит нормально. Служба компилируется и работает нормально. когда я тестирую его в браузере, я получаю следующий результат:

"[{\"CustomerID\":1,\"CustomerCode\":\"AMT-1\",\"CustomerName\":\".AMTDisp\"},{\"CustomerID\":2,\"CustomerCode\":\"COM-2\",\"CustomerName\":\".ComexDisp,_\"}]"

У меня есть испытательный жгут VB, который я использую, чтобы вызвать службу остального и десериализовать возвращенный json

Класс

Public Class Customer
    Public CustomerID As Int32
    Public CustomerCode As String
    Public CustomerName As String
End Class

метод

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

Ошибка

{"Could not cast or convert from System.String to System.Collections.Generic.List'1[RESTTestHarness.Customer]."}

Я использовал множество различных способов, таких как установка bodystyle в Wrapped и наличие корневого объекта. Ничто не работает. Я всегда получаю ту же ошибку. Я считаю, что ошибка здесь очень проста, но я просто не вижу ее сейчас.

  • 0
    Я заметил, что в вашем классе Customer используется только элемент уровня экземпляра, а не открытые свойства, как в вашем классе Customer в вашем методе. Можете ли вы изменить свой класс тестового get;set; для использования открытых свойств get;set; ? и посмотрим что получится?
  • 0
    Я попробовал это, но у меня была та же проблема. Спасибо, в любом случае
Теги:
rest
json.net

1 ответ

0
Лучший ответ

если вы хотите вернуть общий ответ json, вам нужно изменить контракт на обслуживание, чтобы вернуть сообщение, а не строку,

ваша реализация операции обслуживания должна выглядеть примерно так:

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
    Спасибо за ваш ответ Исмаил. Я возвращаюсь домой, так что плохо смотрю на это по утрам.
  • 0
    Brilliant. Это работает удовольствие. Массивная Слава тебе Исмаил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню