0

jsonデータから作成されたバイト配列でgetリクエストに応答するサーブレットを作成しました。このデータをiOSで使用し、NSJSONSerializationを使用してNSDictionaryに解析しようとしていますが、次のエラーで失敗します

Error Domain = NSCocoaErrorDomain Code = 3840 "操作を完了できませんでした。(Cocoaエラー3840。)"(文字11の周りのオブジェクトのキーが重複しています。)UserInfo = 0x6833200{NSDebugDescription=文字11の周りのオブジェクトのキーが重複しています。}

これが私のコードです:

NSString *query = @"http://localhost:8888/url?method=retrieve";

NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:query]];
NSError *error = nil;
NSString *stringData = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"substring to index 255: %@",  [stringData substringToIndex:255]);
NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:[stringData dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error] : nil;
NSLog(@"Response as Dictionary:\n%@", results.description);
if (error) {
    NSLog(@"Error: %@", error);
}

stringDataの値は

{"APPEALS":{"APPEAL":{"AppealID":387423483、 "LastEdit":"1...。

エラーがあるため、Dictionaryとしての応答は明らかに(null)を返します。これは、サーバーが出力ストリームのデータをbyte [](java)として送信し、次のように正しくフォーマットされていないという事実と関係があると推測しています。 jsonをiOSで受信した場合、文字11 ":"で失敗する理由はわかりません。参考までに、サーバーはJavaのGoogle App Engineで記述されており、ローカルホストのurlはローカル開発サーバーです。jsonデータは、JacksonGeneratorライブラリを使用して作成されました。ありがとう!

4

2 に答える 2

2

エラーが「:」文字の重複キーを指している場合、それは次の json 配列内の一部のキーが重複していることを意味し、必ずしもその文字インデックスの直後のキーとは限りません。上記のjsonデータから、多くの「APPEAL」エントリがありました.NSDictionaryに変換すると、特定のキーに対して値が1つしかないため、エラーがスローされます. 私の混乱は、Jackson json ジェネレーターのチュートリアルを読んだことから生じたと思います。このチュートリアルでは、同じキーを使用してエントリを作成し、後でオブジェクト クラス名として「キー」を使用してオブジェクトの多くのインスタンスにシリアル化できるようにします (したがって、多くの APPEAL を作成できたはずです)。オブジェクトは Jackson パーサーを使用しますが、NSJSONSerialization ではそうではありません)。

また、サーバー側でいくつかのjsonファイルを連結しました:

( {"テーブル":{"タイトル":値}}{"別のテーブル":{"タイトル":値}} )

私のURLリクエスト応答は1回のリクエストで複数のファイルを提供できるようにしましたが(コスト効率)、「}}{」は合法的なjson形式ではないため、これらはクライアント側で分割して個別にシリアル化する必要がありました。

于 2012-08-21T15:47:46.847 に答える
0

json に重複したキーがありました。たとえば、{"json":"3","string":"34","json":"3"}.json は iOS6.0 より前では解析できません。

于 2013-12-11T03:26:11.527 に答える