Question

Par défaut, le service WCF encapsule la réponse JSON dans "d". wrapper et là j'ai trouvé un problème avec l'analyse.

Si j'analyse avec JsonConvert.DeserializeObject (réponse) où la réponse est

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

J'ai une erreur:

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

Si je change la réponse en

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

Je l'ai fait fonctionner.

Alors, comment analyser ce "d" encapsulé les réponses JSON des services WCF? Existe-t-il un meilleur moyen d’analyser JSON?

Était-ce utile?

La solution 4

Maintenant, je me suis débarrassé de "d" wrapper avec Regex.Replace et corrige la réponse JSON avec la structure appropriée

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

Je crée également une classe avec Guid et Name, définie sous forme de chaîne.

Puis essayez de le désérialiser avec

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

Mais je reçois une erreur

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

Où est le truc?

Autres conseils

Je suppose que vous utilisez < enableWebScript / > dans votre configuration de comportement, remplacez-le par < webHttp defaultOutgoingResponseFormat = & JSON " / > et vous aurez beau et propre JSON, pas de "d" et pas de "type __"

On dirait que vous utilisez le comportement enableWebScript sur votre webHttpBinding. Vous devriez probablement utiliser le comportement webHttp à la place - cela vous donnera "propre". JSON au lieu du JSON client ASP.NET AJAX.

Prenez votre json et collez-le dans un générateur de classe en ligne, tel que http : //httputility.net/json-to-csharp-vb-typescript-class.aspx . Il vous fournira le code pour désérialiser cet objet JSON, comme ceci (exemple avec VB):

Public Class MyClass
     Public Property D As String
End Class

Collez-le dans votre projet et désérialisez le JSON dans cet objet. La propriété D est maintenant une chaîne qui contient le JSON non enveloppé dont vous aurez besoin pour désérialiser une seconde fois dans votre dernier objet récepteur. Si vous n'êtes pas sûr de la classe à manipuler, collez la chaîne en D dans le même générateur de classe en ligne et vous obtiendrez le code nécessaire pour créer le type permettant de recevoir l'objet!

Si vous passez à WebHttpBehavior et que vous obtenez toujours un message d'erreur indiquant que les éléments de corps ne sont pas enveloppés, définissez manuellement le style de corps des méthodes que vous traitez avec Enveloppé. Faites-le comme ça:

[OperationContract (BodyStyle = WebMessageBodyStyle.Wrapped, ...)] string DoQuelque chose (...)

J'espère que ça aide!

Vous pourriez avoir une classe wrapper de désérialisation qui possède une propriété appelée "d". Une fois la désérialisation réussie, obtenez la valeur de la propriété d.

Peut-être que cela aide.

Le service:

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

Le contrat:

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

Mon fichier Svc ne contient que cette ligne:

<%@ 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top