2013-01-03 15 views
5

Piszę mechanizm C#, aby przesłać plik do serwera Railsowego, używając Json.C# dodanie podwójnych cudzysłowów do początku i końca ciągu JSON skutkuje błędem dekodowania serwera

Zanim przejdziemy do części plików, jestem po prostu staramy się dodawać do serwera, i wydaje się mieć pewne problemy z ciągiem JSON, który pojawia się na serwerze ..

Co mogę robić źle ? Próbowałem już dwóch różnych sposobów serializacji ciągu znaków, a nawet załadowałem już serializowany ciąg ...

Zastanawiam się, czy ma to coś wspólnego z podwójnymi cudzysłowami zarówno na początku, jak i na końcu łańcucha widocznie wysyłanego na serwer i jak je usunąć z wniosku (bez cudzysłowów otaczających i korzystania RestClient z WizTools.org, to wszystko idzie w porządku ...):

MultiJson::DecodeError (757: unexpected token at '"{\"receipt\":{\"total\":100.0,\"tag_number\":\"xxxxx\",\"ispaperduplicate\":true},\"machine\":{\"serial_number\":\"111111\",\"safe_token\":\"1Y321a\"}}"') 

Mój kod C#:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using RestSharp; 
using System.Web.Script.Serialization; 
using Newtonsoft.Json; 

namespace RonRestClient 
{ 


    class templateRequest 
    { 
     public Receipt receipt; 
     public class Receipt 
     { 
      public float total; 
      public String tag_number; 
      public bool ispaperduplicate = true; 
      public Receipt(float total, String tagnr) 
      { 
       this.total = total; 
       this.tag_number = tagnr; 
      } 
     }; 
     public Machine machine; 
     public class Machine 
     { 
      public String serial_number; 
      public String safe_token; 
      public Machine(String machinenr, String safe_token) 
      { 
       this.serial_number = machinenr; 
       this.safe_token = safe_token; 
      } 
     }; 
    } 


    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      string path = @"C:\file.pdf"; 
      string tagnr = "p94tt7w"; 
      string machinenr = "2803433"; 
      string safe_token = "123"; 
      float total = 100; 

      templateRequest req = new templateRequest(); 
      req.receipt = new templateRequest.Receipt(total, tagnr); 
      req.machine = new templateRequest.Machine(machinenr, safe_token); 
      //string json_body = JsonConvert.SerializeObject(req); 
      //string json_body = new JavaScriptSerializer().Serialize(req); 


      string json_body = @"{""receipt"" : {""total"":"[email protected]", ""tag_number"":"""[email protected]""",""ispaperduplicate"":true},""machine"":{""serial_number"": """[email protected]""", ""safe_token"": """[email protected]"""}}"; 

      var client = new RestClient("http://localhost:3000"); 

      var request = new RestRequest("/receipts",Method.POST); 


      //set request Body 
      request.AddHeader("Content-type", "application/json"); 
      request.AddHeader("Accept", "application/json"); 
      request.RequestFormat = DataFormat.Json; 

      request.AddBody(json_body); 
      //request.AddParameter("text/json", json_body, ParameterType.RequestBody); 

      // easily add HTTP Headers 


      // add files to upload (works with compatible verbs) 
      //request.AddFile("receipt/receipt_file",path); 

      // execute the request 

      IRestResponse response = client.Execute(request); 
      var content = response.Content; // raw content as string 
      if(response.ErrorMessage !="") content += response.ErrorMessage; 
      response_box.Text = content; 


     } 
    } 
} 

Odpowiedz

4

Problem polega na tym, że RestRequest.AddBody (source code) metoda faktycznie zakłada, że ​​treść nie jest serializowana do poprawnego formatu.

To znaczy, że uważa, że ​​próbujesz przekazać ciąg .NET jako ciąg JSON, zamiast rozpoznawać, że rzeczywiście chcesz przekazać ten ciąg jako obiekt JSON.

jednak oznacza to, że jesteś rzeczywiście robi zbyt wiele pracy, przez szeregowania obiektu do JSON siebie:

Wymień linia

request.AddBody(json_body); 

z:

request.AddBody(req); 

można kontrolować sposób, w jaki serializacja do JSON odbywa się za pomocą właściwości RestRequest.JsonSerializer.

Jeśli koniecznie chcesz trzymać ciąg JSON, to myślę, że warto napisać:

request.AddParameter("application/json", json_body, ParameterType.RequestBody); 

(widzę, że masz linię która stwierdziła, że ​​praktycznie robi - dlaczego uwag to?)

+0

Awesome, nie tylko pomógł mi rozwiązać ten problem, jak udało Ci się zaproponować dwa różne rozwiązania mojego problemu. Skomentowałem to, ponieważ nie działało: użyłem 'text/json' zamiast' application/json'. W każdym razie, używając 'request.AddBody (req)' również robi sztuczkę ... Teraz muszę po prostu wymyślić jak dodać plik do struktury paragonu. Dzięki ! – MrWater

+0

Jeśli 'request.AddBody (req)' działa, zdecydowanie sugeruję, że używasz tego, ponieważ jest to wyraźnie sposób, w jaki powinieneś używać RestSharp. –

+0

Doskonale! Miałem dokładnie ten sam problem - googled to, pierwszy wynik to, boom! :) Dzięki! – albogdano

Powiązane problemy