2011-05-09 1 views
0

좋아, 나는 간단한 것을 놓치고 있어야한다는 것을 알고있다.C# ASP.NET 웹 서비스 - JSON을 deserialize하고 빈 객체를 가져 오는 중

도움에 감사드립니다!

난 데 문제는 JSON 입력이 제대로라도 직렬화 복원되지 않는 저에게 빈 XML 결과를주고 있다는 점이다 [명확히 수정 됨]. 출력을 XML 형식으로하고 싶습니다. 그냥 비워 두지 않으려 고합니다.

코드는 내 실제 코드를 단순화 한 것입니다. 내 실제 코드에서 다른 웹 사이트에서 JSON을 회수 중이며이를 구문 분석하고 XML SOAP 요청으로 리턴하려고합니다.

간단하게하기 위해 JSON 문자열을 가져 와서 간단히 하드 코딩했습니다.

<?xml version="1.0" encoding="utf-8" ?> 
    <ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="my.soap" /> 
+0

디버거를 사용하여 JSON URL의 형식이 올바른지 확인하거나 반환되는 실제 JSON 데이터를 보았습니까? 나는 [웹 개발 도우미] (http://projects.nikhilk.net/WebDevHelper)를 사용하지만 몇 가지 다른 것들이있다. – WEFX

+0

그것이 도움이되는지 확인하기 위해 체크 아웃해야 할 것입니다. 이전에 디버깅 도구를 살펴 보았지만 사용할 수있는 옵션은 없었습니다.메모장을 사용하여 디버깅 옵션이 제한된이 웹 서비스를 만들었습니다. Visual Web Developer Express로 이동할 수 있는지 확인해야합니다. – Doug

+0

@ user745588 : 제대로 포맷되었으므로 온라인 [JSON validator] (http://jsonformatter.curiousconcept.com/)을 사용하여 확인했습니다. 문제는 클래스에 'PropertySet'이라는 ** 속성 **이 없다는 것입니다 ([대답] (http://stackoverflow.com/questions/5940528/c-asp-net-web-service-trying 참조). -to-deserialize-json-and-getting-empty-object/5940709 # 5940709)를 참조하십시오. – Groo

답변

1

JSON 문자열은 중첩 된 데이터가 들어있는 ResultSet이라는 속성이있는 객체를 나타냅니다.

주의점 JSON의 차이는 의 ResultSet 연재 :

{ 
    "Query": "ibm", 
    "Result": [ ... ] 
}

을 그리고 JSON가 ResultSet 포함 객체 직렬화 : 즉

{ 
    "ResultSet": 
    { 
     "Query": "ibm", 
     "Result": [ ... ] 
    } 
}

을, 그것은 당신이 경우에 작동합니다 입력 문자열에서 ResultSet을 생략하십시오.

string json = @"{"Query":"ibm","Result":[ ... ]}"; 

또는, ResultSet라는 이름의 속성이있는 클래스로 문자열을 역 직렬화하는 경우 : [Serializable] 속성은 아무 상관이

return serializer.Deserialize<ResultSetWrapper>(json); 

하는 것으로 : 당신이 사용해야합니다

public class ResultSetWrapper 
{ 
    public ResultSet ResultSet; 
} 

하는 경우를 XML 직렬화와 관련이 있으므로 필요하지 않습니다. XmlSerializer의 출력을 제어하려면 System.Xml.Serialization 네임 스페이스의 특성을 사용하십시오.

+0

그게 효과가있다. 감사! 나는 그것이 단순해야만한다는 것을 알았다! – Doug

0

시도 추가 [ScriptMethod (ResponseFormat = ResponseFormat.Json)] 등처럼의 WebMethod 아래 :

대신 포맷 된 객체의 웹 서비스에서 반환 다음

[WebService(Namespace="my.soap")] 
public class StockQuote : WebService 
{ 

    [WebMethod(Description="",EnableSession=false)] 
    public ResultSet IBM() 
    { 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    string json = "{\"ResultSet\":{\"Query\":\"ibm\",\"Result\":[{\"symbol\":\"IBM\",\"name\": \"International Business Machines Corp.\",\"exch\": \"NYQ\",\"type\": \"S\",\"exchDisp\":\"NYSE\",\"typeDisp\":\"Equity\"},{\"symbol\":\"IBM.F\",\"name\": \"IBM\",\"exch\": \"FRA\",\"type\": \"S\",\"exchDisp\":\"Frankfurt\",\"typeDisp\":\"Equity\"},{\"symbol\":\"IBM.DE\",\"name\": \"IBM\",\"exch\": \"GER\",\"type\": \"S\",\"exchDisp\":\"XETRA\",\"typeDisp\":\"Equity\"},{\"symbol\":\"^AXI\",\"name\": \"Stlmt ID - NASDAQ OMX Alpha IBM\",\"exch\": \"NAS\",\"type\": \"I\",\"exchDisp\":\"NASDAQ\",\"typeDisp\":\"Index\"},{\"symbol\":\"^IVSPY\",\"name\": \"NASDAQ OMX Alpha IBM vs. SPY\",\"exch\": \"NAS\",\"type\": \"I\",\"exchDisp\":\"NASDAQ\",\"typeDisp\":\"Index\"},{\"symbol\":\"IBMSX\",\"name\": \"Invesco Multi-Sector B\",\"exch\": \"NAS\",\"type\": \"M\",\"exchDisp\":\"NASDAQ\",\"typeDisp\":\"Fund\"},{\"symbol\":\"IBM.BE\",\"name\": \"IBM\",\"exch\": \"BER\",\"type\": \"S\",\"exchDisp\":\"Berlin\",\"typeDisp\":\"Equity\"},{\"symbol\":\"IBM.SG\",\"name\": \"IBM\",\"exch\": \"STU\",\"type\": \"S\",\"exchDisp\":\"Stuttgart\",\"typeDisp\":\"Equity\"},{\"symbol\":\"IBM.BA\",\"name\": \"International Business Machines Corp.\",\"exch\": \"BUE\",\"type\": \"S\",\"exchDisp\":\"Buenos Aires\",\"typeDisp\":\"Equity\"},{\"symbol\":\"IBM.L\",\"name\": \"International Business Machines Corp.\",\"exch\": \"LSE\",\"type\": \"S\",\"exchDisp\":\"London\",\"typeDisp\":\"Equity\"}]}}"; 
    return serializer.Deserialize<ResultSet>(json); 
    } 
} 

[Serializable] 
public class ResultSet 
{ 
    public string Query; 
    public ResSet[] Result; 
} 

[Serializable] 
public class ResSet 
{ 
    public string symbol; 
    public string name; 
    public string exch; 
    public string type; 
    public string exchDisp; 
    public string typeDisp; 
} 

내가 갖는

[WebMethod(Description="",EnableSession=false)] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
+0

그게 나에게 컴파일 오류를 준다. 어쨌든 XML 응답을 원합니다. 내 문제는 JSON을 역 직렬화하여 XML 응답으로 변환 할 수 없다는 것입니다. – Doug

0

웹 서비스가 JSON을 출력하도록 구성되지 않았으므로 XML 용으로 설정됩니다. 설정 방법에 대해서는 SO 게시물을 참조하십시오.

+0

XML을 반환하는 웹 서비스를 원한다면 JSON 데이터를 처리하고 올바르게 처리하지 않아야합니다. 그것이 내가 고치려고하는 부분입니다. – Doug

관련 문제