2014-07-22 6 views
6

Próbuję POST zaktualizować obiekt do interfejsu API serwera REST z mojego klienta. Używam RestSharp i dodaję reprezentację JSON mojego obiektu do treści mojej prośby. Jednak moja reprezentacja ciągów serializowanego obiektu ma nieprawidłowy format. Serwer je odrzuca.Serializowane wyjście JSON ma formatowanie ze zmienną C#

Moja prośba wygląda mniej więcej tak (użyłem Skrzypek je zdobyć)

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}" 

Próbowałem serializacji mojego obiektu z Json.NET, wewnętrznej serializatora Json RestSharp oraz z JavaScriptSerializer od System.Web.Script .Serializacja. Wszystkie zwracają ciąg w takim formacie. Wiem, że powodem takiego formatowania jest to, że C# wymyka się podwójnym cudzysłowom, aby mógł poprawnie wyświetlać je wewnątrz, ale nie rozumiem, w jaki sposób mam je przekazać do mojego żądania bez tego formatowania z zachowaniem. Wiem na pewno, że poprawnie sformułowany JSON jest akceptowany przez serwer.

Obiekt, który próbuję serializować wygląda następująco

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: Przeniesiony moje rozwiązanie stąd do odpowiedzi.

+1

Wygląda na to, że masz podwójną serializację. Czy nie możesz pokazać akcji PUT kontrolera? – Ghukas

+0

Tak, podwójna serializacja była dokładnie moim problemem. Właśnie dodawałem informacje do mojego pierwotnego posta, aby uwzględnić te informacje. Dziękuję Ci. – filipv

+1

@filipv możesz chcieć przenieść swoje rozwiązanie (że był podwójnie serializowany) do odpowiedzi i zaakceptować to. Wtedy ludzie mający ten problem w przyszłości będą mogli lepiej znaleźć rozwiązanie. –

Odpowiedz

10

Właśnie przeczytałem inny temat na ten problem here. Problem polegał na tym, że dwa razy serializowałem obiekt.

Zamiast

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

powinny Użyłem

request.AddBody(priceListItem); 

Zresztą, może to pomoże kogoś innego. Jednak dziwne jest, że obiekt jest automatycznie szeregowany.

-1

Też miałem ten problem, a moim rozwiązaniem było stworzenie JObject z Newtonsoft i przekazanie tego.

Albo:

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

lub

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

Pierwszy przypadek był mój drugi wybór, ale myślę, że jest to błąd w Newtonsoft gdzie JObject.FromObject ignoruje DateFormatString w JsonSerializer.