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

时间:2016-05-11 17:45:40

标签: c# json rest restsharp

我正在尝试使用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;
        }

任何想法都会有所帮助,提前谢谢!

2 个答案:

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