【问题标题】:How can I implicitly serialize via DataContractJsonSerializer when creating StringContent for HTTPClient?为 HTTPClient 创建 StringContent 时,如何通过 DataContractJsonSerializer 隐式序列化?
【发布时间】:2016-01-04 13:11:22
【问题描述】:

我有一个对象,我将其转换为 json 以便将其发送到 Web 服务。 我在类中添加了一个返回 json 字符串的方法

public string ToJson()
{
    return new JavaScriptSerializer().Serialize(this).ToLower();
}

HTTPClient.PutAsync() 方法采用 StringContent 对象,我这样创建:

var content = new StringContent(object.ToJson(), Encoding.UTF8, "application/json");

我可以致电PutAsync(),一切正常。


我最近发现了一种不同的序列化方法,它使用 [DataContract][DataMember]DataContractJsonSerializer 和 Stream 来序列化对象。我想改用这种方法,因为它可以通过属性对结果进行更多控制,但需要更多样板代码(写入流、重新定位、读取等)。

鉴于我使用 Data 属性来指定我的对象应如何序列化,我如何指定应使用 DataContractJsonSerializer 对其进行序列化?最好,我可以简单地将对象传递给 StringContent 而无需显式方法调用,如下所示:

var content = new StringContent(object, Encoding.UTF8, "application/json");

类似于在某些情况下如何隐式调用ToString(),我想知道是否有任何理解如果我将内容类型指定为"application/json",则传递的对象应序列化为json。

【问题讨论】:

    标签: c# json serialization dotnet-httpclient datacontractjsonserializer


    【解决方案1】:

    您可以尝试调整 ToJson 方法,使其改用 DataContractJsonSerializer

    public string ToJson()
    {
        var serializer = new DataContractJsonSerializer(this.GetType());
        using (var stream = new MemoryStream())
        {
            serializer.WriteObject(stream, this);
            return Encoding.UTF8.GetString(stream.ToArray());
        }
    }
    

    顺便问一下,您是否考虑过使用Newtonsoft.Json 库?它还通过[JsonProperty] 属性和自定义转换器为您提供了对序列化过程的大量控制:

    public string ToJson()
    {
        return JsonConvert.SerializeObject(this);
    }
    

    【讨论】:

    • 但这两个都不会被隐式调用,对吧?我想直接将对象提供给 HTTPClient,而无需调用执行序列化的自定义方法。是的,我确实考虑过为此使用第三方库,并认为这在我的情况下毫无意义,并且内置的方法绰绰有余。
    • 你能得到的最接近的方法是使用HttpClient.PostAsJsonAsync 扩展方法,它允许你直接传递一些实例,但在引擎盖下这将使用 Newtonsoft.Json 库来序列化对象并且你没有太多可以做的。
    • 这令人失望。感谢您帮助转换为合同序列化程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2011-08-06
    相关资源
    最近更新 更多