1

TouchJSON シリアライゼーションに関する質問と回答を読みましたが、まだ機能しません。

サンプル データを使用して NSDictionary を作成し、JSONTouch シリアライザーを使用して NSDictionary を JSON に変換しました。ただし、NSData オブジェクト 'theJSONData' をログに記録すると、結果として次のようになります。

<7b223131 31353535 34343434 223a2250 ... 65227d>

さらに、この「theJSONData」データを Web サービス (JSON を想定している) に送信すると、次のように返されます。

2011-07-31 18:48:46.572 街灯[7169:207] シリアル化エラー: (null)

2011-07-31 18:48:46.804 街路灯[7169:207] returnData: (null)

2011-07-31 18:48:46.805 Street Lights[7169:207] エラー: エラー Domain=kJSONScannerErrorDomain Code=-201 「配列をスキャンできませんでした。配列は '[' 文字で開始されていません。」UserInfo=0x4d51ab0 {snippet=!HERE>!?xml version="1.0" 、location=0、NSLocalizedDescription=アレイをスキャンできませんでした。'[' 文字で始まっていない配列、文字 = 0、行 = 0}

私は何を間違っていますか?JSON NSData オブジェクト 'theJSONData' は、Web サービスに送信する前に別の型に変換する必要がありますか? 私が見逃している別のステップはありますか?

// Create the dictionary
NSDictionary *outage = [[NSDictionary alloc] initWithObjectsAndKeys:
                        @"YCoord", @"12678967.543233",
                        @"XCoord", @"12678967.543233",
                        @"StreetLightID", @"666",
                        @"StreetLightCondition", @"Let's just say 'BAD'",
                        @"PhoneNumber", @"1115554444",
                        @"LastName", @"Smith",
                        @"Image",@"",
                        @"FirstName", @"Dawn",
                        @"Comments", @"Pole knocked down",
                        nil];
NSError *error = NULL;

// Serialize the data
NSData *theJSONData = [[CJSONSerializer serializer] serializeDictionary:outage error:&error];
NSLog(@"theJSONData: %@", theJSONData);
NSLog(@"Serialization Error: %@", error);

// Set up the request and send it
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://24.52.35.127:81/StreetLight/StreetlightService/CreateStreetLightOutage"]];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: theJSONData];

// Deserialize the response
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse: nil error:&error];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding];
NSData *theReturnData = [returnString dataUsingEncoding:NSUTF8StringEncoding];
id theObject = [[CJSONDeserializer deserializer] deserializeAsArray:theReturnData error:&error];
NSLog(@"returnData: %@",theObject);
NSLog(@"Error: %@", error);
4

3 に答える 3

1

みんなの助けに感謝します。Fiddler を使用して JSON でサービスに送信する必要があるものを追跡することになり、ヘッダーを正しくフォーマットしていないことがわかりました。これが私のために働いたコードです。

// Create the NSDictionary
NSDictionary *outage = [[NSDictionary alloc] initWithObjectsAndKeys:
                        @"12.543233",@"YCoord", 
                        @"12.543233",@"XCoord", 
                        @"111",@"StreetLightID",
                        @"Dented pole",@"StreetLightCondition", 
                        @"1115554444",@"PhoneNumber", 
                        @"Black",@"LastName", 
                        [NSNull null],@"Image",
                        @"White",@"FirstName", 
                        @"Hit by a car",@"Comments", 
                        nil];

// Serialize the data
NSError *error = NULL;
NSData *theJSONData = [[CJSONSerializer serializer] serializeDictionary:outage error:&error];
NSLog(@"Serialization Error: %@", error);

// Change the data back to a string
NSString* theStringObject = [[NSString alloc] initWithData:theJSONData encoding:NSUTF8StringEncoding];

// Determine the length of the data
NSData *requestData = [NSData dataWithBytes: [theStringObject UTF8String] length: [theStringObject length]];
NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [requestData length]];

// Create request to send to web service
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://11.22.33.444:55/StreetLight/StreetlightService/CreateStreetLightOutage"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:requestData];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"];
[request setTimeoutInterval:30.0];

// Deserialize the response
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse: nil error:&error];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding];
NSData *theReturnData = [returnString dataUsingEncoding:NSUTF8StringEncoding];

id theObject = [[CJSONDeserializer deserializer] deserializeAsArray:theReturnData error:&error];

NSLog(@"returnData: %@",returnString);
NSLog(@"Error: %@", error);
于 2011-08-06T21:49:03.130 に答える
0

1 つには、NSDictionary でオブジェクトとキーが逆になっています。

コードのその部分を支援するのに十分なTouchJSONについて知りません。

于 2011-08-01T02:26:05.760 に答える
0

goodle v3 api 応答の解析で同様の問題が発生しています。私の問題の解決にはまだ近づいていませんが、deserializerAsArray を使用している場合は JSON 応答を "[" と "]" で囲む必要があり、deserializerAsDictionary の場合は JSONレスポンスは「{」と「}」で囲む必要があります。

Google v3 API の JSON 応答は "{" "}" 形式であるため、deserialiserAsDictionary メソッドを使用する必要があります。

あなたはすでにこれを知っていると思いますが、ジョナサン・ワイトのコードを見た後、ジョナサンのコードはJSON応答を解析する際に上記をチェックすることに固有のものであるため、私自身の問題を解決することができました。

ありがとう、

ティム

于 2011-08-03T01:51:03.130 に答える