2016-07-18 216 views
5

Nel mio progetto ho bisogno di inviare un oggetto JSON nella chiamata API del servizio web. Ho convertito JSON dall'array.barre rovesciate "" aggiunte nella stringa JSON per il servizio web in swift

do { 

     let theJSONData = try NSJSONSerialization.dataWithJSONObject(
         param , 
         options: NSJSONWritingOptions(rawValue: 0)) 

     var theJSONText : String = String(data: theJSONData, 
         encoding: NSASCIIStringEncoding)! 

     print(theJSONText) 

     theJSONText = theJSONText.stringByReplacingOccurrencesOfString("\\", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil) 

     print(theJSONText) 

     let newParam = ["ESignData":theJSONText] 


} catch let error as NSError { 
        print(error) 
       } 

si stringa di stampa correttamente come

{"EntNum":"47","JobNo":"1737753","ClientID":"100","HospNo":"1","QAReason":"","DoctorNo":"1694","Action":"Sign"} 
{"EntNum":"47","JobNo":"1737753","ClientID":"100","HospNo":"1","QAReason":"","DoctorNo":"1694","Action":"Sign"} 

Ora Quando provo a trasmettere questo dizionario newParam nella chiamata API, che contiene "\" nei parametri di stringa di stringa JSON.

WebService.PostURL(mainLink, methodname: ESIGNTHISDOC, param: newParam, userName: AUTH_USERNAME, password: AUTH_PWD, CompletionHandler: { (success, response) in 
}) 

E in quel metodo di servizio Web ho param di stampa.

Param = { 
    ESignData = "{\"EntNum\":\"47\",\"JobNo\":\"1737753\",\"ClientID\":\"100\",\"HospNo\":\"1\",\"QAReason\":\"\",\"DoctorNo\":\"1694\",\"Action\":\"Sign\"}"; 
} 

Ora, in questo so che è evidente in iOS a causa di "nella stringa. Ora il problema è che ci sono un sacco di API che lavorano in applicazione android, e lo sviluppatore API non vuole aggiornare il suo codice secondo noi.

so che questo problema si verifica a causa di aggiunta di stringa JSON nel dizionario come parametro. Ma non ho adeguata giustificazione che così, se qualche prova sarà anche utile per me per convincerlo.

qualsiasi soluzione per convertire la stringa JSON senza backslash in iOS? Devo risolvere il problema da parte mia, se possibile. Qualsiasi aiuto sarà apprezzato

EDIT:

Sul lato server ha bisogno come

ESignData = {"EntNum":"47","JobNo":"1737753","ClientID":"100","HospNo":"1","QAReason":"","DoctorNo":"1694","Action":"Sign"} 

Se mi passa questo come parametro nella POSTINO di quanto non dà messaggio di successo. Ma non con il nostro oggetto con "\" in esso.

EDIT 2:

Ora la stampa del newParam dizionario:

print(newParam) 
print("-------------------------") 
print(newParam["ESignData"]) 

e tronchi:

["ESignData": "{\"EntNum\":\"47\",\"JobNo\":\"1737754\",\"ClientID\":\"100\",\"HospNo\":\"1\",\"QAReason\":\"\",\"DoctorNo\":\"1694\",\"Action\":\"Sign\"}"] 
------------------------- 
Optional("{\"EntNum\":\"47\",\"JobNo\":\"1737754\",\"ClientID\":\"100\",\"HospNo\":\"1\",\"QAReason\":\"\",\"DoctorNo\":\"1694\",\"Action\":\"Sign\"}") 

E per il debug:

Printing description of newParam: 
▿ 1 elements 
    ▿ [0] : 2 elements 
    - .0 : "ESignData" 
    - .1 : "{\"EntNum\":\"47\",\"JobNo\":\"1737754\",\"ClientID\":\"100\",\"HospNo\":\"1\",\"QAReason\":\"\",\"DoctorNo\":\"1694\",\"Action\":\"Sign\"}" 

Così dimostra che è nel nostro dizionario. Tutti "sono uniti da \"

+0

Io non so come si è stampato il parametro sul lato server, ma vedendo la racchiude ' "'s, apparentemente a due caratteri-sequenza' \" 'Rappresenterebbe un singolo carattere' ''. Molti output di debug utilizzano questo tipo di notazione "String-letteral-like". Credo che i tuoi parametri siano stati inviati al server con successo – OOPer

+0

@OOPer Questo è stampato dalla nostra parte lato server, Abbiamo appena ricevuto la risposta di errore perché non possono recuperare i parametri richiesti – Max

+0

Quindi, il motivo non è la barra rovesciata. Controllare il riferimento API se il 'newParam' è valido per l'API. – OOPer

risposta

1

Mi sono imbattuto in questo numero esatto oggi.Per me sembra che la codifica predefinita per qualsiasi NSURLRequest è una stringa. Quindi, da qualche parte tra il mio creare la richiesta di dizionario e il server analizzandolo, i backslash apparirebbero e il server ha avuto problemi con il mio carico.

ho risolto il problema in modo esplicito affermando che il mio carico è stato JSON impostando l'intestazione del tipo di contenuto.

[authRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

Ora, quando creo dati JSON da un dizionario, i backslash non appaiono e il server è in grado di analizzare tutto correttamente.

seguente snippet di codice per completezza:

NSMutableURLRequest *authRequest = [[[NSURLRequest alloc] initWithURL:authURL] mutableCopy]; 
[authRequest setHTTPMethod:@"POST"]; 
NSURLSession *session = [NSURLSession sharedSession]; 

[authRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

NSDictionary *bodyDictionary = @{@"User_Name": user, @"Password_Hash": password}; 

if ([NSJSONSerialization isValidJSONObject:bodyDictionary]) { 
    NSError *error; 
    NSData *bodyData = [NSJSONSerialization dataWithJSONObject:bodyDictionary options:0 error:&error]; 
    if (!error) { 
     [authRequest setHTTPBody:bodyData]; 
    } else { 
     NSLog(@"Unable to convert to JSON DATA %@", error.localizedDescription); 
    } 
}