JsonConvert.Десериализуетобъект и “общую” оболочку в WCF

StackOverflow https://stackoverflow.com/questions/1625500

  •  06-07-2019
  •  | 
  •  

Вопрос

По умолчанию служба 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top