如何纠正ios中的字符串格式错误

时间:2016-01-18 07:03:56

标签: ios json

这是我实际的json回复:

{
"x": {
"user": {
"id": 1,
"name": "a"
},
"startday": "2016-01-10",
"status": "New",
"total": 1,
"time_entries": [
{
"id": 766,
"project": {
"id": 3,
"name": "b"
},
"issue": {
"id": 4
},
"user": {
"id": 1,
"name": "c"
},
"activity": {
"id": 8,
"name": "d"
}
"hours": 1,
"comments": "",
"spent_on": "2016-01-10"
}
]
}
}

我动态创建了这个响应,如下所示:

NSString * newstring = [NSString stringWithFormat:@"{\\\"wk_time\\\":\%@\{\\\"user\\\":\%@\{\\\"id\\\":\%@\,\\\"name\\\":\\\"%@\\\"\%@\,\\\"startday\\\":\\\"%@\\\",\\\"status\\\":\\\"%@\\\",\\\"total\\\":\%@\,\\\"time_entries\\\":[{\\\"id\\\":766,\\\"project\\\":\%@\{\\\"id\\\":\%@\,\\\"name\\\":\\\"%@\\\"\%@\,\\\"issue\\\":\%@\{\\\"id\\\":\%@\%@\,\\\"user\\\":\%@\{\\\"id\\\":\%@\,\\\"name\\\":\\\"%@\\\"\%@\,\\\"activity\\\":\%@\{\\\"id\\\":\%@\,\\\"name\\\":\\\"%@\\\"\%@\,\\\"hours\\\":\%@\,\\\"comments\\\":\%@\,\\\"spent_on\\\":\\\"%@\\\"\%@\}",,,...];

然后,按照规定的格式进行:

NSString * newstring1 = [NSString stringWithFormat:@“\"@%@\"",newstring];
NSLog(@"%@",newstring1);

所以,回复是:

@"{\"x\":{\"user\":{\"id\":1,\"name\":\"b\"},\"startday\":\"2016-01-10\",\"status\":\"New\",\"total\":1.0,\"time_entries\":[{\"id\":766,\"project\":{\"id\":3,\"name\":\"a\"},\"issue\":{\"id\":4},\"user\":{\"id\":1,\"name\":\"b\"},\"activity\":{\"id\":8,\"name\":\"c\"},\"hours\":1.0,\"comments\":\"\",\"spent_on\":\"2016-01-10\"}]}}”

如果我像这样静态发布此回复:

NSString * jsoncode =@"{\"x\":{\"user\":{\"id\":1,\"name\":\"b\"},\"startday\":\"2016-01-10\",\"status\":\"New\",\"total\":1.0,\"time_entries\":[{\"id\":766,\"project\":{\"id\":3,\"name\":\"a\"},\"issue\":{\"id\":4},\"user\":{\"id\":1,\"name\":\"b\"},\"activity\":{\"id\":8,\"name\":\"c\"},\"hours\":1.0,\"comments\":\"\",\"spent_on\":\"2016-01-10\"}]}}";
NSData *objectData = [jsoncode  dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError];

它被序列化。显示了这个场景中的值。但是这样动态创建:

NSString * newstring = [NSString stringWithFormat:@"{\\\"wk_time\\\":\%@\{\\\"user\\\":\%@\{\\\"id\\\":\%@\,\\\"name\\\":\\\"%@\\\"\%@\,\\\"startday\\\":\\\"%@\\\",\\\"status\\\":\\\"%@\\\",\\\"total\\\":\%@\,\\\"time_entries\\\":[{\\\"id\\\":766,\\\"project\\\":\%@\{\\\"id\\\":\%@\,\\\"name\\\":\\\"%@\\\"\%@\,\\\"issue\\\":\%@\{\\\"id\\\":\%@\%@\,\\\"user\\\":\%@\{\\\"id\\\":\%@\,\\\"name\\\":\\\"%@\\\"\%@\,\\\"activity\\\":\%@\{\\\"id\\\":\%@\,\\\"name\\\":\\\"%@\\\"\%@\,\\\"hours\\\":\%@\,\\\"comments\\\":\%@\,\\\"spent_on\\\":\\\"%@\\\"\%@\}",,,...];
NSString * newstring1 = [NSString stringWithFormat:@"@\"%@\"",newstring];
NSError *error=nil;
NSData * objectData = [newstring1 dataUsingEncoding:NSUTF8StringEncoding];

日志显示数据值。  但是在这一步之后,

NSDictionary * json= [NSJSONSerialization JSONObjectWithData:objectData options:0 error:&error];

序列化后,它显示空值。

NSLog(@"%@",error);

在错误消息中显示此信息。

  

错误域= NSCocoaErrorDomain代码= 3840“操作不能   完成。 (可可错误3840.)“(JSON文本没有以数组或   允许片段未设置的对象和选项。)UserInfo = 0x7fe0faa73210   {NSDebugDescription = JSON文本不是以数组或对象开头的   允许片段未设置的选项。}

转换为字典。

可能是什么错误。如何纠正?请在此方面提供指导。谢谢你的帮助。在静态做它可以工作,但动态创建它显示错误?如何纠正它?

1 个答案:

答案 0 :(得分:0)

您错过了activity字典后面的。我格式化了`JSON'。

{  
   "x":{  
      "user":{  
         "id":1,
         "name":"a"
      },
      "startday":"2016-01-10",
      "status":"New",
      "total":1,
      "time_entries":[  
         {  
            "id":766,
            "project":{  
               "id":3,
               "name":"b"
            },
            "issue":{  
               "id":4
            },
            "user":{  
               "id":1,
               "name":"c"
            },
            "activity":{  
               "id":8,
               "name":"d"
            },
            "hours":1,
            "comments":"",
            "spent_on":"2016-01-10"
         }
      ]
   }
}

您需要检查一下有很多网站和附加组件。建议的是https://jsonformatter.curiousconcept.com/

Chrome扩展程序是:JSON编辑器