0

У меня есть объект, который я конвертирую в json, чтобы отправить его в веб-службу. я добавил метод класса, который возвращает JSON снабжать струной, тетивой и т.п.Как я могу неявно сериализовать через DataContractJsonSerializer при создании StringContent для HTTPClient?

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 и поток сериализовать объект. Я хотел бы использовать этот метод вместо этого, потому что он дает больший контроль над результатом с атрибутами, но требует гораздо большего кода шаблона (запись в поток, перемещение, чтение и т. Д.).

Учитывая, что я использовал атрибуты Data, чтобы указать, как должен быть сериализован мой объект, как я могу указать, что для его сериализации следует использовать DataContractJsonSerializer? Предпочтительно, я могу просто передать объект StringContent без явного вызова метода, например, так:

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

Подобно тому, как ToString() неявно вызывается в определенных ситуациях, я хотел бы знать, если есть что-то, что понимает, что если Я указываю тип содержимого "application/json", что переданный объект должен быть сериализован в json.

ответ

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); 
} 
+0

Но ни это будет называться неявно, не так ли? Я хотел бы напрямую передавать объекты в HTTPClient, без необходимости вызова настраиваемого метода, который выполняет сериализацию. Да, я решил использовать стороннюю библиотеку для этого и решил, что это бессмысленно в моей ситуации и что встроенные способы более чем достаточны. – null

+0

. Самый близкий, который вы можете получить, - это метод расширения ['HttpClient.PostAsJsonAsync'] (https://msdn.microsoft.com/en-us/library/hh944521 (v = vs.118) .aspx), который позволяет вам непосредственно передайте какой-то экземпляр, но под капотом это будет использовать библиотеку Newtonsoft.Json для сериализации объекта, и вы не можете с этим поделать. –

+0

Это неутешительно. Спасибо за вашу помощь в преобразовании в сериализатор контрактов. – null

 Смежные вопросы

  • Нет связанных вопросов^_^