2011-11-18 2 views
0

JSON을 반환하는 웹 서비스가 있습니다. 브라우저 또는 테스트 프로그램을 통해 프로그램을 테스트 할 때 문자열에는 항상 백 슬래시가 추가됩니다. 내가 문자열을 만들 JSON.NET 및 JsonTextWriter을 사용하고WCF 웹 서비스가 여분의 백 슬래시가있는 JSON 문자열을 반환합니다.

{"ack":{"qry":[{"retn":"abcd","desc":"defg"}] 

실제로 게재되어

{\"ack\":{\"qry\":[{\"retn\":\"abcd\",\"desc\":\defg\"}. 

과 같은 예를 들어, 내 출력을 기대하고있는 경우처럼 보일 수 있습니다.

private string jsonParse(string respStr) 
    { 
     string jSonStr; 
     StringBuilder sb = new StringBuilder(); 
     StringWriter sw = new StringWriter(sb); 

     JsonWriter writer = new JsonTextWriter(sw); 
     writer.Formatting = Formatting.None; 

     List<string> commands = (from word in respStr.Split(':') select word).ToList(); 
     for (int j = 0; j < commands.Count; j += 3) 
     { 
      List<string> param = (from par in commands[j + 2].Split(new Char[] { ',', '=' }) select par).ToList(); 

      writer.WriteStartObject(); 
      writer.WritePropertyName(commands[j]); 
      writer.WriteStartObject(); 
      writer.WritePropertyName(commands[j + 1]); 
      writer.WriteStartArray(); 
      writer.WriteStartObject(); 
      for (int i = 0; i < param.Count - 1; i += 2) 
      { 
       writer.WritePropertyName(param[i]); 
       writer.WriteValue(param[i + 1]); 
      } 
      writer.WriteEndObject(); 

      writer.WriteEndArray(); 
      writer.WriteEndObject(); 
      writer.WriteEndObject(); 
     } 
     jSonStr = sb.ToString(); 

     return jSonStr; 
    } 

내 웹 서비스의 운영 계약은 다음과 같습니다

HttpWebRequest GETRequest = (HttpWebRequest)WebRequest.Create(url); 
GETRequest.Method = "GET"; 

Console.WriteLine("Sending GET Request"); 
HttpWebResponse GETResponse = (HttpWebResponse)GETRequest.GetResponse(); 
Stream GETResponseStream = GETResponse.GetResponseStream(); 
StreamReader sr = new StreamReader(GETResponseStream); 

Console.WriteLine(sr.ReadToEnd()); 

단서로 :

[OperationContract] 
[WebGet(ResponseFormat=WebMessageFormat.Json, UriTemplate="/{system}/{command}")] 
string getMethod(string system, string command); 

마침내 나는 시험에 사용하고 프로그램과 같이 HttpWebRequest를 사용 왜 이런 일이 일어나는가?

답변

3

왜 JSON 문자열로 문자열을 인코딩하는 것이 좋을지 모르겠지만 JSON .Net을 사용하지 않는 것이 좋으며 DataContracts를 사용하는 것이 더 낫다고 제안 할 수 있습니다. 서비스는 실행중인 인프라에 대해 알 필요가 없습니다. 당신과 같이 당신의 방법을 정의하는 경우 : 다음

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "/{system}/{command}")] 
Response getMethod(string system, string command); 

그리고 응답 객체에 대해 같은 것을 할 그래서 (난 그냥 더미 개체를 반환)처럼

[DataContract] 
public class Response 
{ 
    [DataMember(Name = "ack")] 
    public Acknoweldge Acknowledge { get; set; } 
} 

[DataContract] 
public class Acknoweldge 
{ 
    [DataMember(Name = "qry")] 
    public IEnumerable<Query> Query { get; set; } 
} 

[DataContract] 
public class Query 
{ 
    [DataMember(Name = "desc")] 
    public string Description { get; set; } 

    [DataMember(Name = "retn")] 
    public string Return { get; set; } 
} 

이 그런 다음 메소드를 구현 :

public Response getMethod(string system, string command) 
{ 
    return new Response 
     { 
      Acknowledge = new Acknoweldge 
       { 
        Query = new List<Query> 
         { 
          new Query { Return = "abcd", Description = "defg" } 
         } 
       } 
     }; 
} 

특히, 당신은 당신이 찾고있는 결과를 얻을 것이다 클라이언트 코드 샘플을 실행 :

{"ack":{"qry":[{"desc":"defg","retn":"abcd"}]}} 
+0

나는이 솔루션을 좋아한다. 귀하의 서비스는 클라이언트가 데이터를 사용하는 방법에 대해 완전히 독립적이어야합니다. 절대적으로 필요한 경우가 아니면 특정 클라이언트에 대한 서비스를 코딩하지 마십시오. –

관련 문제