2016-10-27 12 views
0

私のJSON-RPCクエリに問題があります。結果として、私はこの出力を得るObjective-C JSON-RPCリクエストの問題

NSString *jsonString = @"{id:1,method:getHolidays,jsonrpc:2.0}"; 
NSString *requestString = [NSString stringWithFormat:@"%@",jsonString,nil]; 

NSData *requestData = [NSData dataWithBytes: [jsonString UTF8String] length: [requestString length]]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:@"https://neilo.webuntis.com/WebUntis/jsonrpc.do?school=htl_v%C3%B6cklabruck"]]; 

[request setHTTPMethod: @"POST"]; 
[request setValue:@"Content-type: application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:requestData]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil ]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding]; 

NSLog(@"\n\n\noutput: %@",returnString); 

{"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"Parse error: Unexpected character ('i' (code 105)): was expecting double-quote to start field name\n at [Source: [email protected]; line: 1, column: 3]"}}

結果は次のようになります。 - >message = not-authenticated < -

誰もが、問題が何であるか任意のアイデアを持っていますか?

+0

'NSDictionaryの* jsonDict = @ {@ "id":@ 1、 "メソッド":@ "getHolidays"、@ "jsonrpc":@ "2.0"};あなたがJSONバリデータに文字列JSONをコピー/ペーストすると、それは有効ではないことがわかります。NSNET * jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0エラー:&error]; '...' [setHTTPBody:jsonData] (文字列を囲む引用符がありません)。これは 'NSJSONSerialization'が辞書を使って構築されているため(パラメータを変更しやすいため)、NSJSONSerializationが処理して簡素化する' {"id":1、 "method": "getHolidays"、 "jsonrpc":2.0} 'でなければなりません。 – Larme

+0

そうですね! NSString * jsonString = @ "{\" id \ ":\"メソッド\ ":\" getHolidays \ "、\" jsonrpc \ ":\" 2.0 \ "}"; – Darkdrummer

+0

自分でJSON Stringを構築するのではなく、 'NSJSONSerialization'を使うことをお勧めします。より安全です(エラーパラメータが有効でない場合は、特に変更可能なNSMutableArray/Dictionaryを使用して、追加することができるキーがある場合は変更する方が簡単です)。また、 'sendSynchronousRequest:returningResponse:error:'を避け、 'NSURLSession'を使って非同期のものを優先します。 – Larme

答えて

0

was expecting double-quote to start field name:

サーバーからJSONが無効であることが伝えられています。

{id:1,method:getHolidays,jsonrpc:2.0}をJSON検証ツール(例:http://jsonlint.com/)でテストすると、そのように表示されます。前述のように、文字列(キー/値)ごとに周囲の引用符がありません:{"id": 1,"method": "getHolidays","jsonrpc": 2.0}が有効です。

あなたが試したように、@"{\"id\":\"1\",\"method\":\"getHolidays\",\"jsonrpc\":\"2.0‌​\"}"が動作します。

私はNSJSONSerializationを使用することをお勧めします、サンプルテストしていませんが(コンパイルされない場合があります):あなたは"(のような\")をエスケープする必要はありません

NSDictionary *jsonDict = @{@"id":@1, 
          @"method":@"getHolidays", 
          @"jsonrpc":@"2.0"}; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:&error]; 
... 
[request setHTTPBody:jsonData]; 

、あなたのパラメータの条件がある場合には、 if(someReason){doNotPutmethodKeyInJSON}と言うと、NSMutableDictionaryで、より簡単で読みやすくなります(特に、新しい文字列のすべてが\"であれば、どこで問題を読むのが難しくなりますか)。 また、無効なJSONの場合は、 error

あなたがそのコードを置く場所を私は知りませんが、それは、メインスレッドの場合、それは、UIをブロックするので、sendSynchronousRequest:returningResponse:error:を避けるだろう、(NSURLSessionの助けを借りて)非同期呼び出しを好む

+0

クイック返信をありがとうが、NSURLセッションの意味を理解できていませんでした。 – Darkdrummer

+0

これは、Web呼び出しを非同期で処理するクラスです。それについてのチュートリアル、docなどがあります。 – Larme

関連する問題