【问题标题】:Property mapping in RestSharp for JSON doesn't workRestSharp for JSON 中的属性映射不起作用
【发布时间】:2014-02-28 16:26:21
【问题描述】:

我有这样的代码:

using System;
using RestSharp.Serializers;

public class Program
{
    public static void Main()
    {
        var obj = new Order();
        obj.Test = 42;
        var serializer = new JsonSerializer();
        var json = serializer.Serialize(obj);
        Console.WriteLine(json);    
    }
}

public class Order
{
    [SerializeAs(Name = "object")]
    public string Object
    {
        get { return "Order"; }
    }

    [SerializeAs(Name = "TestName")]
    public int Test
    {
        get;set;
    }           
}

基于 SerializeAs 属性,RestSharp 应该使用属性名称,而不是属性名称。但它只是忽略它。此代码的输出是:

{
  "Object": "Order",
  "Test": 42
}

是我遗漏了什么还是它不适用于 RestSharp?

DotNetFiddle 中的相同代码 sn-p - http://dotnetfiddle.net/ffaXUY

【问题讨论】:

  • 这还能编译吗? Object 是保留关键字
  • 我们可以使用类名作为属性名。没关系。但是如果我使用object,那么它将无法编译

标签: .net json serialization restsharp


【解决方案1】:

根据this resource

RestSharp 决定在 v107.0 中恢复对 Newtonsoft.JSON 的支持。

因此,如果您使用的是 RestSharp 107+,则可以安全地使用 JsonPropertyAttribute 属性来指定属性映射。这在使用其他命名约定(例如蛇形大小写)处理 API 时特别有用。

Related

【讨论】:

  • 嗯,是的。那很有意思。我会接受这个答案,因为它是最新的信息。谢谢!
【解决方案2】:

嗯,RestSharp 使用 SimpleJson,它没有任何对 SerializeAs 的引用,它也没有自己的机制。 我找到了一个拉取请求 - https://github.com/restsharp/RestSharp/pull/331 ,但由于 SimpleJson,它被关闭了。

IJsonSerializerStrategy - PocoJsonSerializerStrategy 的默认实现中,有一些初始逻辑来进行属性名称替换,但现在不起作用。它有这样的方法 - https://github.com/facebook-csharp-sdk/simple-json/blob/master/src/SimpleJson/SimpleJson.cs:

protected virtual string MapClrMemberNameToJsonFieldName(string clrPropertyName)
{
    return clrPropertyName;
}

所以我只是根据本文中的示例将 SimpleJson 替换为 Newtonsoft Json - http://blog.patrickmriley.net/2014/02/restsharp-using-jsonnet-serializer.html

【讨论】:

  • 但它不适用于反序列化。如何使用响应数据获得这种行为?
  • RestSharp 使用 Newtonsoft Json.Net 有一段时间了。见my answer
猜你喜欢
  • 2011-12-23
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多