Domanda

Per impostazione predefinita, il servizio WCF include la risposta JSON in " d " wrapper e lì ho riscontrato un problema con l'analisi.

Se analizzo JsonConvert.DeserializeObject (risposta) dove si trova la risposta

"{\"d\":\"{\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\":\"Thelma\",\"d56d4d4f-6029-40df-a23b-de27617a1e43\":\"Louise\"}\"}"

Errore:

After parsing a value an unexpected character was encoutered: a. Line 1, position 9.

Se cambio risposta in

"{\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\":\"Thelma\",\"d56d4d4f-6029-40df-a23b-de27617a1e43\":\"Louise\"}"

L'ho fatto funzionare.

Quindi, come analizzare questo " d " racchiuso le risposte JSON dai servizi WCF? Esiste un modo migliore per analizzare JSON?

È stato utile?

Soluzione 4

Ora mi sono liberato di " d " wrapper con Regex.Replace e correggi la risposta JSON con la struttura corretta

{\"Guid\":\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\",\"Name\":\"Thelma\"}
{\"Guid\":\"d56d4d4f-6029-40df-a23b-de27617a1e43\",\"Name\":\"Lousie\"}\"}

Faccio anche una classe con Guid e Nome, definita come stringa in essa.

Quindi prova a deserializzarlo con

List<myStruct> o = JsonConvert.DeserializeObject<List<myStruct>>(response);

Ma ricevo un errore

Expected a JsonObjectContract or JsonDictionaryContract for type 'System.Collections.Generic.List`1[mynamespace.myStruct]', got 'Newtonsoft.Json.Serialization.JsonArrayContract'.

Dov'è il trucco?

Altri suggerimenti

Suppongo che tu stia utilizzando < enableWebScript / > nella configurazione del tuo comportamento, sostituiscilo con < webHttp defaultOutgoingResponseFormat = " Json " / > e otterrai un simpatico e pulito JSON, no " d " e nessun " __ tipo "

Sembra che tu stia utilizzando il comportamento enableWebScript sul tuo webHttpBinding. Probabilmente dovresti invece utilizzare il comportamento webHttp: questo ti dà "pulito" JSON invece del client ASP.NET AJAX JSON.

Prendi il tuo json e incollalo in un generatore di classi online, come http : //httputility.net/json-to-csharp-vb-typescript-class.aspx . Ti fornirà il codice per deserializzare questo oggetto json in questo modo (esempio VB):

Public Class MyClass
     Public Property D As String
End Class

Incollalo nel tuo progetto e deserializza il json in questo oggetto. La proprietà D ora è una stringa che contiene il json non scartato che dovrai deserializzare una seconda volta nel tuo oggetto ricevente finale. Se non sei sicuro della classe che dovrai gestire, incolla la stringa in D nello stesso generatore di classi online e avrai il codice necessario per creare il tipo per ricevere l'oggetto!

Se stai passando a WebHttpBehavior e ricevi ancora un messaggio di errore relativo agli elementi del corpo che non vengono avvolti, imposta manualmente lo stile del corpo dei metodi che stai affrontando su Wrapped. Fallo in questo modo:

[OperationContract (BodyStyle = WebMessageBodyStyle.Wrapped, ...)] stringa DoSomething (...)

Spero che questo aiuti!

Potresti avere una classe wrapper di deserializzazione che ha una proprietà chiamata " d " ;. Dopo aver deserializzato con successo, ottieni il valore dalla proprietà d.

Forse questo aiuta.

Il servizio:

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

Il contratto:

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

Il mio file Svc ha solo questa riga:

<%@ 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top