将JSON属性映射到自定义C#类
我试图使用RestSharp将JSON响应映射到c#类。我能够正确地映射响应中的几乎所有字段,但是有一些字段(即属性字段)被标记为将JSON属性映射到自定义C#类,c#,json,rest,restsharp,C#,Json,Rest,Restsharp,我试图使用RestSharp将JSON响应映射到c#类。我能够正确地映射响应中的几乎所有字段,但是有一些字段(即属性字段)被标记为null。我想知道我是否需要做一些特殊的事情来处理这些案件 JSON的返回如下所示: { "Response": { "@VersionNumber": "5.0", "ResponseDetail": { "CriteriaText": { "$": "Name"
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”)]
之上,但也没有成功
这是我的电话:
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;
}
公共响应GetData(字符串端点)
{
RestRequest请求=新的RestRequest(Method.GET)
{
RequestFormat=DataFormat.Json,
资源=_版本+端点,
RootElement=“响应”
};
AddHeader(“授权”、\u令牌);
var响应=_client.Execute(请求);
if(response==null | |!PassCodes.Contains(response.StatusCode))
{
返回null;
}
返回响应数据;
}
任何想法都会有帮助,提前谢谢 要使用
Newtonsoft.Json.JsonProperty
属性,您需要将RestSharp从它自己的序列化程序切换到Newtonsoft.Json。将此代码作为基础:
并将NewtonsoftJsonSerializer
注册为:
client.AddHandler("application/json", new NewtonsoftJsonSerializer());
然后,JsonProperty
将起作用:
[JsonProperty("@Foo")]
public string Foo { get; set; }
[JsonProperty("$")]
public string Bar { get; set; }
我能够通过做一个简单的字符串替换来实现我想要的。我去掉了所有前导的@,并将任何单个“$”重命名为Value
request.OnBeforeDeserialization = (x =>
{
x.Content = x.Content.Replace("\"@", "\"").Replace("\"$\"","\"Value\"");
});
知道这一点很有帮助。。我可以试一试。是否有更好的方法解决我的问题,或者这可能是最好的选择?@KevinMee,建议使用(而且可能是唯一一种)自定义序列化的方法(如自述文件中所述:)。而且它很灵活:可以使用任何JSON框架,而不仅仅是JSON.NET。谢谢您的回复。。我正在努力实现这一点,但在我的测试过程中,似乎现在我没有从响应中获得数据(它仍然存在于内容部分中)。。我遗漏了什么吗?@KevinMee,我不确定这两个序列化程序是否完全可比较,因此最好从简单的大小写开始,反序列化简单的json响应,如
{“Normal”:“OK”}
,然后逐个添加复杂的属性。
[JsonProperty("@Foo")]
public string Foo { get; set; }
[JsonProperty("$")]
public string Bar { get; set; }
request.OnBeforeDeserialization = (x =>
{
x.Content = x.Content.Replace("\"@", "\"").Replace("\"$\"","\"Value\"");
});