我正在尝试使用RestSharp将JSON响应映射到c#类。我能够正确映射响应中的几乎所有字段,但是有一些,即属性字段,被标记为null
。我想知道为了处理这些案件我是否需要做些特别的工作。
JSON的返回如下所示:
{
"Response": {
"@VersionNumber": "5.0",
"ResponseDetail": {
"CriteriaText": {
"$": "Name"
}
}
"ResultQuantity": 1,
"Result": [
{
"Id": "1234567890",
"PrimaryName": {
"OrganizationName": {
"$": "CompanyName"
}
}
}
}
}
我能够正确地提取所有数据,除了任何属性(以@或$开头)。
以下是我尝试绘制响应的方式:
public class Response
{
public string VersionNumber { get; set; }
public ResponseDetail ResponseDetail { get; set; }
public Result Result { get; set; }
}
我尝试在VersionNumber [JsonProperty("@VersionNumber")]
上方添加此项,但这也不成功。
这是我的GET电话:
public Response GetData(string endpoint)
{
RestRequest request = new RestRequest(Method.GET)
{
RequestFormat = DataFormat.Json,
Resource = _version + endpoint,
RootElement = "Response"
};
request.AddHeader("Authorization", _token);
var response = _client.Execute<Response>(request);
if (response == null || !PassCodes.Contains(response.StatusCode))
{
return null;
}
return response.Data;
}
任何想法都会有所帮助,提前谢谢!
答案 0 :(得分:3)
要使用Newtonsoft.Json.JsonProperty
属性,您需要将RestSharp从其自己的序列化程序切换到Newtonsoft.Json。请将此代码视为基础:http://bytefish.de/blog/restsharp_custom_json_serializer/。
public class NewtonsoftJsonSerializer : IJsonSerializer
{
private Newtonsoft.Json.JsonSerializer serializer;
public NewtonsoftJsonSerializer(Newtonsoft.Json.JsonSerializer serializer)
{
this.serializer = serializer;
}
public string ContentType {
get { return "application/json"; } // Probably used for Serialization?
set { }
}
public string DateFormat { get; set; }
public string Namespace { get; set; }
public string RootElement { get; set; }
public string Serialize(object obj)
{
using (var stringWriter = new StringWriter())
{
using (var jsonTextWriter = new JsonTextWriter(stringWriter))
{
serializer.Serialize(jsonTextWriter, obj);
return stringWriter.ToString();
}
}
}
public T Deserialize<T>(RestSharp.IRestResponse response)
{
var content = response.Content;
using (var stringReader = new StringReader(content))
{
using (var jsonTextReader = new JsonTextReader(stringReader))
{
return serializer.Deserialize<T>(jsonTextReader);
}
}
}
public static NewtonsoftJsonSerializer Default
{
get
{
return new NewtonsoftJsonSerializer(new Newtonsoft.Json.JsonSerializer()
{
NullValueHandling = NullValueHandling.Ignore,
});
}
}
}
如果使用最新的RestSharp版本,则需要添加无参数的ctor:
public NewtonsoftJsonSerializer()
{
this.serializer = new JsonSerializer();
}
并将NewtonsoftJsonSerializer
注册为:
client.AddHandler("application/json", new NewtonsoftJsonSerializer());
然后JsonProperty
将起作用:
[JsonProperty("@Foo")]
public string Foo { get; set; }
[JsonProperty("$")]
public string Bar { get; set; }
答案 1 :(得分:0)
通过简单的字符串替换,我能够实现我想要的东西。我删除了任何领先的@以及重命名的任何单曲&#34; $&#34;为了价值。
request.OnBeforeDeserialization = (x =>
{
x.Content = x.Content.Replace("\"@", "\"").Replace("\"$\"","\"Value\"");
});