我正在尝试通过使用json.net库来改进默认的reasharp序列化。为了自定义序列化,您必须实现ISerializer接口:

public class LowerCaseSerializer : ISerializer{
    public LowerCaseSerializer(){
        ContentType = "application/json";
    }

    public string Serialize(object obj){
         var settings = new JsonSerializerSettings{
            ContractResolver = new LowerCaseResolver()
        };
        return JsonConvert.SerializeObject(obj, Formatting.None, settings);
    }

    string ISerializer.RootElement { get; set; }
    string ISerializer.Namespace { get; set; }
    string ISerializer.DateFormat { get; set; }
    public string ContentType { get; set; }
}
.

你看,我也在扩大僵制。这是DeplyCasing的实际代码:

public class LowerCaseResolver : DefaultContractResolver{
    protected override string ResolvePropertyName(string propertyName){
        return propertyName.ToLower();
    }
}
.

一旦设置所有这些,我可以使用reakarp:

var request = new RestRequest(url, method);
if (ShouldAddBody(method)){
    request.JsonSerializer = new LowerCaseSerializer();
    request.AddObject(body);
}
var response = client.Execute<T>(request);
.

一切工作,除了属性不是小写的。调试调试器时,调试程序进入Serializers的构造函数,但它的方法永远不会调用。当我尝试完全相同的Deserializations时(IDeserialize接口附加到客户端),每个属性都调用了下壳的方法。

我还尝试了什么:

request.RequestFormat = DataFormat.Json;  // no change
// this correctly lower cases the properties
var json = new LowerCaseSerializer().Serialize(body);
// wrong request sent to the server, it tells me that some property is missing
request.AddBody(json);
// the exact same thing with this
request.AddParameter("application/json", json, ParameterType.RequestBody);
.

我注意到最后两种的东西:如果我有小写属性,并且etharp序列化序列化,那么请求有5个参数(每个属性一个)。如果我通过大量添加它,它只有一个属性,这是整个JSON。

我检查剩下的休息问题无济于事。任何建议?

更新:

这个非常奇怪:

  • 分叉的redsharp,安装了json.net,工作正常
  • 从reastharp fork复制休息类,粘贴到我的应用程序,使用它,工作正常
  • 启动新项目,通过包管理器安装reasharp和json.net,工作正常
然后从我的主应用程序中删除所有包,重新加载,不起作用。有点放弃了这一点。

更新2: 调试通过叉式版本我注意到这一点:RequestFormat必须是dataformat.json,或者它将使用XML序列化器。但这并没有解决问题。我尝试将两个(只有两个)序列化器设置为null:

request.JsonSerializer = null;
request.XmlSerializer = null;
.

在新项目中,我这样做会导致按预期的nullreferrenceException。但在旧的中,没有任何反应。我尝试重命名变量,使另一个相同类型的变量,但没有任何修复。似乎在这个项目中,我有休息课程的课程是糟糕的。

我还向解决方案添加了一个新项目。即使是代码有效。所以它只是一个有问题的项目。

有帮助吗?

解决方案

由于您无法在新项目中重现它,因此在此特定项目中必须有不同的事情,这导致问题,您正在描述。

你可以尝试的几件事(没有特别的顺序):

  • 检查您是否在两个项目中使用了与库中的完全相同的版本(有效的一个,并且它没有):包版和目标平台(Net4,Net35 ......)。

  • 删除非工作项目的packages文件夹,以便强制核心核桃以重新下载所有包。

  • 查找Visual Studio Propertial窗口中引用库的确切路径,当您选择的Referent节点中有reakarp时。在工作和非工作项目引用的库之间进行二进制比较。

  • 不幸的是,在 symbolsource 中,没有符号包restsharp无法在非工作项目中直接调试RETSHARP。你可以使用反射器vspro 如果您有许可证或之前没有使用过试验。

  • 将不工作项目的部分移动到工作,直到它停止工作。

编辑:

查看源代码

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top