默认情况下,Restsharp JSON序列化程序生成的JSON无效

时间:2014-03-20 18:37:01

标签: c# restsharp

我的代码如下。当我发布一个包含\v的JSON主体时,服务器会收到无法解析的JSON。有关如何使其工作的任何帮助?

编辑:好吧,关于我的服务器无法解析它的论点很弱,但http://jsonlint.com/也抱怨它。 :)

在我的emacs中,它看起来像这样:

{"key":"a^Kb"}

其中^K我认为是单个角色。

代码:

using RestSharp;
using System;
using System.Collections.Generic;

namespace testapp
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new RestClient();
            var request = new RestRequest();

            request.Method = Method.POST;
            request.RequestFormat = DataFormat.Json;
            request.Resource = "http://example.com/";

            var data = new Dictionary<string, string>();
            data.Add("key", "a\vb");
            request.AddBody(data);

            var response = client.Execute<Dictionary<string, string>>(request);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

默认的RestSharp JSON序列化程序将其序列化为C#字符串"{\"key\":\"a\vb\"}";也就是说,它通过线路将\v作为原始字节(0b)发送。这就是您的服务器无法阅读它的原因。我不确定这是否是合法的JSON,但无论如何都有办法逃避这样的角色以避免问题。

我建议使用Json.NET来取消/序列化您的JSON。如果您使用the following class(最初是RestSharp的一部分)作为序列化程序,它将使用Json.NET并且应该正常工作,因为它将\v编码为\u000b。此处复制了代码(无评论,并为了清晰而重命名)以供参考:

public class JsonNetSerializer : ISerializer
{
    private readonly Newtonsoft.Json.JsonSerializer _serializer;

    public JsonNetSerializer()
    {
        ContentType = "application/json";
        _serializer = new Newtonsoft.Json.JsonSerializer
        {
            MissingMemberHandling = MissingMemberHandling.Ignore,
            NullValueHandling = NullValueHandling.Include,
            DefaultValueHandling = DefaultValueHandling.Include
        };
    }

    public JsonNetSerializer(Newtonsoft.Json.JsonSerializer serializer)
    {
        ContentType = "application/json";
        _serializer = serializer;
    }

    public string Serialize(object obj)
    {
        using (var stringWriter = new StringWriter())
        {
            using (var jsonTextWriter = new JsonTextWriter(stringWriter))
            {
                jsonTextWriter.Formatting = Formatting.Indented;
                jsonTextWriter.QuoteChar = '"';

                _serializer.Serialize(jsonTextWriter, obj);

                var result = stringWriter.ToString();
                return result;
            }
        }
    }

    public string DateFormat { get; set; }
    public string RootElement { get; set; }
    public string Namespace { get; set; }
    public string ContentType { get; set; }
}

要使用它,请添加以下行:

request.JsonSerializer = new JsonNetSerializer();

它将序列化为:

{
  "key": "a\u000bb"
}

根据JSONLint,这完全有效。