将JSON属性映射到自定义C#类

将JSON属性映射到自定义C#类,c#,json,rest,restsharp,C#,Json,Rest,Restsharp,我试图使用RestSharp将JSON响应映射到c#类。我能够正确地映射响应中的几乎所有字段,但是有一些字段(即属性字段)被标记为null。我想知道我是否需要做一些特殊的事情来处理这些案件 JSON的返回如下所示: { "Response": { "@VersionNumber": "5.0", "ResponseDetail": { "CriteriaText": { "$": "Name"

我试图使用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”)]
之上,但也没有成功

这是我的电话:

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\"");
        });