默认的Restsharp JSON序列化器生成的无效JSON

本文关键字:JSON 无效 序列化 Restsharp 默认 | 更新日期: 2023-09-27 17:51:05

我的代码如下:当我发布一个包含'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);
        }
    }
}

默认的Restsharp JSON序列化器生成的无效JSON

默认的RestSharp JSON序列化器将其序列化为相当于c#字符串"{'"key'":'"a'vb'"}";也就是说,它将'v作为原始字节(0b)通过网络发送。这就是为什么您的服务器无法读取它的原因。我不确定这是否是合法的JSON,但在任何情况下都有方法转义这样的字符以避免问题。

我建议使用Json。. NET来反/序列化JSON。如果您使用以下类(最初是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是完全有效的