默认的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序列化器将其序列化为相当于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是完全有效的