2014-07-22 5 views
6

Sto provando a POST un oggetto aggiornato all'API del server REST dal mio client. Sto usando RestSharp e sto aggiungendo la rappresentazione JSON del mio oggetto al corpo della mia richiesta. Tuttavia, la mia rappresentazione di stringa dell'oggetto serializzato ha un formato errato. Il server lo rifiuta.L'output serializzato JSON ha formattazione escape C#

La mia richiesta simile a questa (io ho usato Fiddler per farlo)

PUT https://myapp.net/api/PriceListItems/151276 HTTP/1.1 
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml 
User-Agent: RestSharp/104.4.0.0 
Content-Type: application/json 
Host: myapp.net 
Content-Length: 75 
Accept-Encoding: gzip, deflate 

"{\"Id\":151276,\"AgendaId\":0,\"CurrencyId\":1,\"Code\":\"\",\"Price\":7.0}" 

ho cercato di serializzare il mio oggetto con Json.NET, serializzatore JSON interna di RestSharp e con JavaScriptSerializer da System.Web.Script .Serialization. Tutti restituiscono una stringa in tale formato. So che il motivo di tale formattazione è dato dal fatto che C# sfugge alle virgolette doppie in modo che possano visualizzarle correttamente all'interno, ma non capisco come dovrei passarlo alla mia richiesta senza questa formattazione di escape. So per certo che JSON correttamente formato è accettato dal server.

L'oggetto che sto cercando di serializzare aspetto come questo

public class PriceListItem 
    { 
     public static PriceListItem CreatePriceListItem(int id, int agendaId, int currencyId, string code, string unit, decimal price) 
     { 
      var priceListItem = new PriceListItem 
      { 
       Id = id, 
       AgendaId = agendaId, 
       CurrencyId = currencyId, 
       Code = code, 
       Price = price 
      }; 
      return priceListItem; 
     } 

     public int Id { get; set; } 

     public int AgendaId { get; set; } 

     public int CurrencyId { get; set; } 

     public string Code { get; set; } 

     public decimal Price { get; set; } 

EDIT: spostato la mia soluzione da qui a risposte.

+1

Sembra che tu abbia una doppia serializzazione. Non potresti mostrare l'azione PUT del tuo controller? – Ghukas

+0

Sì, la doppia serializzazione era esattamente il mio problema. Stavo solo aggiungendo informazioni al mio post originale per includere tali informazioni. Grazie. – filipv

+1

@filipv si potrebbe voler spostare la soluzione (che è stata serializzata doppia) in una risposta e accettarla. Quindi le persone che hanno questo problema in futuro saranno in grado di trovare la soluzione migliore. –

risposta

10

Ho appena letto un altro argomento su questo problema here. Il problema era che serializzavo l'oggetto due volte.

Invece di

request.AddBody(JsonConvert.SerializeObject(priceListItem)); 

avrei dovuto usare

request.AddBody(priceListItem); 

In ogni caso, forse sarà aiutare qualcun altro. Trovo strano tuttavia che l'oggetto sia serializzato automaticamente.

-1

Ho anche avuto questo problema, e la mia soluzione era creare un JObject con Newtonsoft e passare quello.

O:

JObject jBytes = Object.Parse(JsonConvert.SerializeObject(myObject, MyDateTimeFmtString); 

o

JObject jBytes = JObject.FromObject(myObject, MyJsonSerializer); 

Il primo caso è stata la mia seconda scelta, ma penso che ci sia un bug in cui Newtonsoft JObject.FromObject ignora il DateFormatString in JsonSerializer.