У меня проблема сериализации и десериализации 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 и наличие корневого объекта. Ничто не работает. Я всегда получаю ту же ошибку. Я считаю, что ошибка здесь очень проста, но я просто не вижу ее сейчас.
если вы хотите вернуть общий ответ 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);
}
get;set;
для использования открытых свойствget;set;
? и посмотрим что получится?