JsonConvert.Десериализуетобъект и “общую” оболочку в WCF
Вопрос
По умолчанию служба WCF упаковывает ответ JSON в оболочку "d", и там я обнаружил проблему с его синтаксическим анализом.
Если я проанализирую с помощью JsonConvert.ДесериализиРовать объект (ответ) где находится ответ
"{\"d\":\"{\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\":\"Thelma\",\"d56d4d4f-6029-40df-a23b-de27617a1e43\":\"Louise\"}\"}"
Я обнаружил Ошибку:
After parsing a value an unexpected character was encoutered: a. Line 1, position 9.
Если я изменю ответ на
"{\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\":\"Thelma\",\"d56d4d4f-6029-40df-a23b-de27617a1e43\":\"Louise\"}"
У меня это получилось.
Итак, как разобрать эти ответы в формате JSON, завернутые в "d", из служб WCF?Есть ли какой-нибудь лучший способ разобрать JSON?
Решение 4
Теперь я избавился от " d " оболочка с Regex.Replace и исправьте ответ JSON с правильной структурой
{\"Guid\":\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\",\"Name\":\"Thelma\"}
{\"Guid\":\"d56d4d4f-6029-40df-a23b-de27617a1e43\",\"Name\":\"Lousie\"}\"}
Я также создаю класс с Guid и Name, определенными как строка в нем.
Затем попробуйте десериализовать его с помощью
List<myStruct> o = JsonConvert.DeserializeObject<List<myStruct>>(response);
Но я получаю ошибку
Expected a JsonObjectContract or JsonDictionaryContract for type 'System.Collections.Generic.List`1[mynamespace.myStruct]', got 'Newtonsoft.Json.Serialization.JsonArrayContract'.
Где трюк?
Другие советы
Я предполагаю, что вы используете < enableWebScript / >
в своей конфигурации поведения, замените его на < webHttp defaultOutgoingResponseFormat = " Json " / >
и вы получите хороший и чистый JSON, нет " d " и нет "___ типа"
Похоже, вы используете поведение enableWebScript в своем webHttpBinding. Вы, вероятно, должны использовать поведение webHttp вместо этого - это дает вам «чистый» quot; JSON вместо ASP.NET AJAX-клиента JSON.
Возьмите свой json и вставьте его в онлайн-генератор классов, например, http : //httputility.net/json-to-csharp-vb-typescript-class.aspx . Он предоставит вам код для десериализации этого объекта json, например так (пример VB):
Public Class MyClass
Public Property D As String
End Class
Вставьте это в свой проект и десериализуйте JSON в этот объект. Свойство D теперь представляет собой строку, содержащую развернутый json, который вам потребуется во второй раз десериализовать в ваш последний получающий объект. Если вы не уверены в классе, который вам понадобится, вставьте строку в D в тот же генератор онлайн-классов, и у вас будет код, необходимый для создания типа для получения объекта!
Если вы переключаетесь на WebHttpBehavior и по-прежнему получаете сообщение об ошибке об элементах тела без переноса, вручную установите стиль тела методов, с которыми вы работаете, на Wrapped. Сделай это так:
[OperationContract (BodyStyle = WebMessageBodyStyle.Wrapped, ...)] строка DoSomething (...)
Надеюсь, это поможет!
У вас может быть класс-оболочка десериализации, у которого есть одно свойство с именем " d " ;. Как только вы успешно десериализовали его, получите значение из свойства d.
Может быть, это поможет.
Служба:
namespace Application.Service
{
[ServiceBehavior(UseSynchronizationContext = false,
ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerCall),
AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class VendorService : IVendorService
{
public List<Vendor> RetrieveMultiple(int start, int limit, string sort, string dir)
{
//I don't do any manual serialization
return new Vendor();
}
}
}
Контракт:
[ServiceContract(Namespace = "Application.Service.Contracts")]
public interface IVendorService
{
[OperationContract]
[WebInvoke(ResponseFormat=WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
List<Vendor> RetrieveMultiple(int start, int limit, string sort, string dir);
}
В моем Svc-файле есть только эта строка:
<%@ ServiceHost Service="Application.Service.VendorService" %>
Web.config
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<behaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript />
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="DefaultServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<service behaviorConfiguration="DefaultServiceBehavior" name="Application.Service.VendorService">
<endpoint behaviorConfiguration="jsonBehavior" address="" binding="webHttpBinding" contract="Application.Service.Contracts.IVendor" />
</service>