我的代码如下。当我发布一个包含\v
的JSON主体时,服务器会收到无法解析的JSON。有关如何使其工作的任何帮助?
{"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);
}
}
}
答案 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,这完全有效。