我真的很想尝试将一个JSON文件读入Swift,所以我可以玩它.我已经花了2天的时间重新搜索和尝试不同的方法,但没有运气,所以我已经注册StackOverFlow,看看是否有人可以指出我正确的方向.....
我的JSON文件名为test.json,包含以下内容:
{
"person":[
{
"name": "Bob",
"age": "16",
"employed": "No"
},
{
"name": "Vinny",
"age": "56",
"employed": "Yes"
}
]
}
Run Code Online (Sandbox Code Playgroud)
该文件直接存储在文档中,我使用以下代码访问它:
let file = "test.json"
let dirs : String[] = NSSearchPathForDirectoriesInDomains(
NSSearchpathDirectory.DocumentDirectory,
NSSearchPathDomainMask.AllDomainMask,
true) as String[]
if (dirs != nil) {
let directories: String[] = dirs
let dir = directories[0]
let path = dir.stringByAppendingPathComponent(file)
}
var jsonData = NSData(contentsOfFile:path, options: nil, error: nil)
println("jsonData \(jsonData)" // This prints what looks to be JSON encoded data.
var jsonDict = …Run Code Online (Sandbox Code Playgroud) 我想在我的swift项目中创建一个函数,将String转换为Dictionary json格式,但是我遇到了一个错误:
无法转换表达式的类型(@lvalue NSData,选项:IntegerLitralConvertible ...
这是我的代码:
func convertStringToDictionary (text:String) -> Dictionary<String,String> {
var data :NSData = text.dataUsingEncoding(NSUTF8StringEncoding)!
var json :Dictionary = NSJSONSerialization.JSONObjectWithData(data, options:0, error: nil)
return json
}
Run Code Online (Sandbox Code Playgroud)
我在Objective-C中创建了这个函数:
- (NSDictionary*)convertStringToDictionary:(NSString*)string {
NSError* error;
//giving error as it takes dic, array,etc only. not custom object.
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
return json;
}
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的Swift结构.
struct Usage {
var totalData: Double
var remainingTotalData: Double
init(jsonData: NSData) {
var jsonDict = [String: AnyObject]()
do {
jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as! [String: AnyObject]
} catch {
print("Error occurred parsing data: \(error)")
}
totalData = jsonDict["totalfup"] as! Double
remainingTotalData = jsonDict["totalrem"] as! Double
}
}
Run Code Online (Sandbox Code Playgroud)
从API,我得到以下JSON响应.这是jsonDict变量的println .
[
"totalfup": 96.340899,
"totalrem": 3548710948
]
Run Code Online (Sandbox Code Playgroud)
当我尝试将totalfup属性的值分配给属性时totalData,我收到此错误.
无法将"NSTaggedPointerString"类型的值转换为"NSNumber"
谁知道为什么?我尝试将属性类型更改为float然后将整个结构更改为类但仍然会出现问题.
如果我有一个NSString并且我想使用NSJSONSerialization吗?我该怎么做呢?
我想我知道如何使用NSJSONSerialization.我正在打电话的是:
[NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error]
Run Code Online (Sandbox Code Playgroud)
其中parameters是一个NSDictionary,其中包含要在JSON请求中使用的键和值.一切都很好,直到我必须使用null作为值而不是空字符串.我找不到将值设置为null的方法.我需要创建的json示例是:
{"target"
{"firstname":<firstname>,
"lastname":<lastname>},
"error":null
}
Run Code Online (Sandbox Code Playgroud)
设置服务器的方式是,如果没有错误,它会将错误视为字符串或null.
有任何想法吗?我错过了API调用或类似的东西吗?
谢谢!
如何防止NSJSONSerialization在我的URL字符串中添加额外的反斜杠?
NSDictionary *info = @{@"myURL":@"http://www.example.com/test"};
NSData data = [NSJSONSerialization dataWithJSONObject:info options:0 error:NULL];
NSString *string = [[NSString alloc] initWithData:policyData encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);//{"myURL":"http:\/\/www.example.com\/test"}
Run Code Online (Sandbox Code Playgroud)
我可以去除反斜杠并使用该字符串,但如果可能的话我想跳过这一步......
在以下json上执行NSJSONSerialization有时会给我NSCFString*,有时在字符串值上给我NSTaggedPointerString*.有谁知道为什么会这样,NSJSONSerialization用什么来确定它返回哪种类型?
jsonData = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&parseError];
{
"UserPermissionsService": {
"ServiceHeader": {},
"UserApplicationPermissions": {
"ApplicationPermissions": {
"ApplicationID": "TEST",
"Permission": [
{
"Locations": [
"00000"
],
"PermissionID": "LOGIN"
},
{
"Locations": [
"00000"
],
"PermissionID": "SALES_REPORT_VIEW"
}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
"LOGIN"以NSTaggedPointerString*的形式返回."SALES_REPORT_VIEW"返回的是一个NSCFString*.这对我正在使用和投射值的下游产生影响.
UPDATE
这是我学到的......
"当整个值可以保存在指针本身而不分配任何数据时,会产生NSTaggedPointerString."
这里有一个详细的解释......
https://www.mikeash.com/pyblog/friday-qa-2015-07-31-tagged-pointer-strings.html
由于NSTaggedPointerString是NSString的子类,因此显示引号/不显示引号对我来说永远不会成为问题,因为使用了数据.
感谢所有评论的人.我很自在地理解NSJSONSerialization在做什么.
NSData* jsonDataToSendTheServer;
NSDictionary *setUser = [NSDictionary
dictionaryWithObjectsAndKeys:[@"u" stringByAppendingString:my.id],@"id",
@"GET_USER_INFO",@"command",
@"",@"value",
nil];
NSLog(@"%@", jsonDataToSendTheServer);
Run Code Online (Sandbox Code Playgroud)
这是我的代码.当我运行上面的代码时,我得到了这个打印
<7b226964 223a2275 35383738 37373334 31222c22 636f6d6d 616e6422 3a224745 545f5553 45525f49 4e464f22 2c227661 6c756522 3a22227d>
Run Code Online (Sandbox Code Playgroud)
我不知道我是否可以创建一个json.
我怎样才能解决这个问题?
问题是当数据不完整NSJSONSerialization.JSONObjectWithData导致应用程序崩溃unexpectedly found nil while unwrapping an Optional value而不是通知我们使用NSError变量时.所以我们无法阻止崩溃.
您可以在下面找到我们正在使用的代码
var error:NSError? = nil
let dataToUse = NSJSONSerialization.JSONObjectWithData(receivedData, options: NSJSONReadingOptions.AllowFragments, error:&error) as NSDictionary
if error != nil { println( "There was an error in NSJSONSerialization") }
Run Code Online (Sandbox Code Playgroud)
直到现在我们都无法找到解决方法.
我是新来的,这是我的第一个问题......我尝试在Swift 2中编写一个发出HTTP POST请求的应用程序,但我无法弄清楚如何使用Swift 2的新错误处理.任何人都可以请告诉我如何在下面的代码片段中实现Swift 2 的" do-try-catch "错误处理?(此代码段使用swift 1.2的旧错误处理)
func post(params : Dictionary<String, String>, url : String) {
var request = NSMutableURLRequest(URL: NSURL(string: url)!)
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil/*, error: &err*/)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
print("Response: \(response)")
var strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Body: \(strData)")
var err: NSError?
var json = NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves/*, error: &err*/) …Run Code Online (Sandbox Code Playgroud)