Веб-служба WCF возвращает строку JSON с дополнительными обратными слешами - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть веб-сервис, который возвращает JSON.При тестировании программы через браузер или тестовую программу в строку всегда добавляются дополнительные обратные косые черты.Например, если я ожидаю, что мой вывод будет выглядеть следующим образом:

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

, он фактически будет отображаться как

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

Я использую JSON.NET и JsonTextWriter для создания строки.

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

контракт на работу для моего веб-сервиса выглядит следующим образом:

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

и, наконец, программа, которую я использую для тестирования, использует HttpWebRequest следующим образом:

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

есть хоть какая-то подсказка, почему это происходит?

1 Ответ

3 голосов
/ 22 ноября 2011

Не уверен, почему это происходит (возможно, двойное кодирование строки в строку JSON), но могу ли я предположить, что вам лучше не использовать для этого JSON .Net, а вместо этого использовать DataContracts - это намного проще и означает ваш сервисне нужно знать об инфраструктуре, на которой он работает.Если вы определяете свой метод следующим образом:

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

И затем делаете что-то подобное для объекта Response:

[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"}]}}
...