RestSharp:如何跳过将空值序列化为JSON?

17

RestSharp内置的JSON序列化程序会序列化对象的所有属性,即使它们为空或者是默认值。我该如何使其跳过这些属性?


2
Json.NET有这样一个参数。JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore...不确定RestSharp是否有类似的功能。 - thenewseattle
3个回答

10

作为替代方案,您可以使用其他支持忽略 null 值进行序列化的 JSON 库(json.net、servicestack.text 等)先对其进行序列化:

RestRequest request = new RestRequest();
...
string jsonString = ThirdPartySerialization(jsonObject);
request.AddParameter("application/json", jsonString, ParameterType.RequestBody);

8

您可以使用自定义的IJsonSerializerStrategy与默认的SimpleJson JSON序列化器一起忽略空值。

最简单的方法是扩展PocoJsonSerializerStrategy,如下所示。

public class IgnoreNullValuesJsonSerializerStrategy : PocoJsonSerializerStrategy
{
    protected override bool TrySerializeUnknownTypes(object input, out object output)
    {
        bool returnValue = base.TrySerializeUnknownTypes(input, out output);

        if (output is IDictionary<string, object> obj)
        {
            output = obj.Where(o => o.Value != null).ToDictionary(o => o.Key, o => o.Value);
        }

        return returnValue;
    }
}

然后将其用作默认的序列化策略。
SimpleJson.CurrentJsonSerializerStrategy = new IgnoreNullValuesJsonSerializerStrategy();

谢谢您的回复,但是目前在至少106.1.0版本的RestSharp中无法使用,我们正在等待以下问题的解决:https://github.com/restsharp/RestSharp/issues/1018希望一旦问题得到解决,这个功能将再次可用,或者至少会有非常相似的替代方案。 - James Eby
@JamesEby 那不正确。这个解决方案仍然有效,与您提到的问题无关。 我发布的解决方案直接在 RestSharp 使用的静态 SimpleJson 类上配置序列化器策略,因此不受 RestSharp 中有限的配置选项的影响。 官方文档甚至提到可以像这样自定义序列化器策略(在此页面底部):https://github.com/restsharp/RestSharp/wiki/Deserialization - Conyc
1
我想说的是,静态类在代码中已经不存在了,或者至少它似乎已经被移除了。在最新版本的RestSharp中,我找不到任何名为SimpleJson配置类的东西。如果我错了,而你仍然能看到它,请告诉我。 - James Eby
2
@JamesEby 它仍然存在,但在106.1.0中它的命名空间似乎已经改变了。在早期版本中,它位于“RestSharp”命名空间中,而现在似乎位于“SimpleJson”命名空间中。我会更新我的答案以反映这一点。感谢您指出! - Conyc
SimpleJson已经移回到RestSharp命名空间。 - Conyc

0

这里有一个链接,指向已经修改过以忽略空值的版本。你只需要设置序列化选项来忽略 null 值。

忽略空值的 Restsharp


3
似乎不再起作用-请求的JsonSerializer上没有Options属性。 - wwarby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接