wcf의 jsonconvert.deserializeobject 및 "d"래퍼
문제
기본적으로 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>