gpt4 book ai didi

ios - NSJSON 序列化 - "Unexpected end of file during string parse"

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:16:12 25 4
gpt4 key购买 nike

我在解析一些 REST 响应时遇到一些有线问题。问题是,我无法重现它。有时会发生,而我在错误日志中没有相应的信息。

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unexpected end of file during string parse (expected low-surrogate code point
but did not find one).) UserInfo=0x157bddb0 {NSDebugDescription=Unexpected end of file during string parse (expected low-surrogate code point but did not find one).}


抱歉,由于敏感的用户数据,我不能向您提供任何来自 JSON-Response 的信息(它只出现在一些内部帐户上,错误日志级别设置得很低以检测此问题)。


一些其他信息:

  • JSON 有效(通过 http://jsonlint.com/ 检查)
  • 尝试重现此问题时,我得到了其他 NSError 描述,例如:
    • XYZ 位置的字符无效
    • 无效对象
    • ...



更新1:解析机制(NSData的扩展)

- (NSDictionary *)objectFromJSONDataWithError:(NSError **)error {
NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData: self
options: 0
error: error];

return jsonObject;
}



更新 2: 用于下载数据的 NSOperation - main() 的内容 --> 调用更新 1 中的函数

NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = nil;

for (NSInteger i=0; i<kMaxRequestRetry; i++) {
data = [NSURLConnection sendSynchronousRequest: request
returningResponse: &response
error: &error];

if (!error) {
// Handling internal errors and retry mechanism
}

[NSThread sleepForTimeInterval:1.0];
}

// Check http status code
NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
if (statusCode < 200 || statusCode >= 300) {
CLogWarn(@"Request finished with status code = %d", (int)statusCode);
}

// Evaluate response
if (error) {
CLogError(@"%@", error);
[self requestFinishedWithResult:@"{\"errorCode\":99}";
return;
} else {
NSError *parseError = nil;
NSDictionary *responseDic = [data objectFromJSONDataWithError:&parseError];

// Detect parse issues
if (parseError) {
CLogError(@"JSONParse-Error: %@", parseError);
[self requestFinishedWithResult:[NSString stringWithFormat:@"{\"errorCode\":%d}", (11000 + (int)parseError.code)]];
return;
}

// Success handling
}



更新 3:JSON-Object 结构

{
"errorCode": 0,
"conversations": [
{
"address": "+43664000000",
"snippet": "This is an dummy text",
"messagesUnread": 1,
"messagesUnsent": 2,
"messages": 9,
"maxMessageId": 151672,
"dateLastMessage": 1386353756858
}
]
}



我很高兴获得有关如何强制执行此错误代码的任何信息或提示。

最好的问候,
克里斯

最佳答案

问题复现

出现此问题的原因是json 中的string 包含非法的Unicode Point。以下代码可以重现此问题。

NSString* test = @"{\"\\ud801\" : 1}";
NSError* error = nil;
id result = [NSJSONSerialization JSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
NSLog(@"error: %@", error);

解决方案

根据 Readme.md in JSONKit ,您可以使用 JSONKit 作为额外的解析器。例如

 id result = [NSJSONSerialization JSONObjectWithData:data options:options error:&error];
if (error) {
error = nil;
result = [data objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode error:& error]; // use JSONKit
}

关于ios - NSJSON 序列化 - "Unexpected end of file during string parse",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23077588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com