문제

기본적으로 WCF Service Wrap JSON 응답 "D"래퍼 및 그곳에서 구문 분석에 문제가 있음을 발견했습니다.

내가 구문 분석한다면 jsonConvert.deserializeObject (응답) 응답이있는 곳

"{\"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\"}"

나는 그것을 작동시켰다.

그렇다면이 "D"가 WCF 서비스에서 JSON 응답을 구문 분석하는 방법은 무엇입니까? JSON을 구문 분석하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책 4

이제 regex.replace와 적절한 구조로 JSON 응답을 수정 한 "D"래퍼를 제거했습니다.

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

또한 문자열로 정의 된 GUID와 이름을 가진 수업을 만듭니다.

그런 다음 필자적으로 그것을 시도하십시오

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"없음, 그리고 "__type"가 없습니다.

webhttpbinding에서 enablewebscript 동작을 사용하는 것 같습니다. 대신 webhttp 동작을 사용해야 할 것입니다. ASP.NET AJAX 클라이언트 JSON 대신 "Clean"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로 전환하고 신체 요소가 랩핑되지 않은 것에 대한 오류 메시지가 표시 되더라도, 래핑하려는 방법의 신체 스타일을 수동으로 설정하십시오. 그렇게하십시오 :

OperationContract (BodyStyle = WebMessageBodyStyle.wrapped, ...)] String 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