为HTTPClient创建StringContent时,如何通过DataContractJsonSerializer隐式



我有一个对象,我将其转换为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。

您可以尝试调整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);
}

相关内容

最新更新