4

JSONの解析中にこのエラーが発生します:

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unable to convert data to string around character 73053.) UserInfo=0x1d5d8250 {NSDebugDescription=Unable to convert data to string around character 73053.}

これを修正する方法の提案はありますか?

追加 エラーレポートに記載されているように、パーサーは位置73053の文字を通過できません。これは私のJSON応答の「ø」です。私の知る限り、Ø、Å、Æなどの文字はjsonパーサーにとって問題ではないはずですか?

4

4 に答える 4

22

はい、エンコーディングの問題で同じ問題が発生し、上記のエラーが発生しました。サーバーからNSDataをとして取得しましたencoding:NSISOLatin1StringEncoding。そのため、NSJSONSerializationを使用して解析する前に、UTF8に変換する必要がありました。

NSError *e = nil;
NSString *iso = [[NSString alloc] initWithData:d1 encoding:NSISOLatin1StringEncoding];
NSData *dutf8 = [iso dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:dutf8 options:NSJSONReadingMutableContainers error:&e];
于 2016-02-11T11:37:01.797 に答える
7

Switf 3

let responseStrInISOLatin = String(data: data, encoding: String.Encoding.isoLatin1)
guard let modifiedDataInUTF8Format = responseStrInISOLatin?.data(using: String.Encoding.utf8) else {
      print("could not convert data to UTF-8 format")
      return
 }
do {
    let responseJSONDict = try JSONSerialization.jsonObject(with: modifiedDataInUTF8Format)
} catch {
    print(error)
}
于 2017-01-04T18:02:05.800 に答える
6

解析しているデータが実際に有効なJSONであることを確認してください(「ほぼ」JSONだけではありません)。このエラーは、JSONとして解析できない別のデータ形式がある場合に発生することが知られています。たとえば、次を参照してください。

iOS5JSON解析でCocoaエラー3840が発生する

JSONにもトップレベルのコンテナーがありますか?配列または辞書。例:

{ "response" : "Success" }

アップデート

JSONのデフォルトのエンコーディングはUTF-8です。特殊/エキゾチック文字はUTF-8の問題ではありませんが、サーバーがUTF-8として適切にエンコードされたコンテンツを返していることを確認してください。また、JSONインタープリターに別のエンコーディングを使用するように指示するために何かしましたか?

JSONがWebサービスからのものである場合は、このページにURLを入力して、エンコーディングについて何を確認する必要があるかを確認してください。

http://validator.w3.org/

于 2013-01-14T15:28:59.337 に答える
3

スウィフト5:

はい、JSONデータの解析中に同じエラーが発生しました。

解決策:最初に応答データを文字列に変換してから、デコードする前にUTF8エンコーディングを使用してそのStingをデータに変換する必要があります。

let utf8Data = String(decoding: responseData, as: UTF8.self).data(using: .utf8)
于 2019-05-30T04:55:47.147 に答える