我试图了解NSJSONSerialization类参考.由于缺少developer.apple.com网站上的代码示例,我输了.网上有数以百万计的例子和其他json库,但是我还没有能够使用最新版本的xcode.(我正在运行:版本4.3.1(4E1019)并在iPhone 5.0.1上进行测试)
我想使用按钮将json文件中的数据提取到我的iphone中.
让我说我从URL获取我的数据: http://companyurl/jsonfile.json(标准JSON格式)
jsonfile.json看起来像这样......;
{
"companylist":
[
{
"company":"Companyname 1",
"telephone":"1234567890",
"url":"http:\/\/www.companyname1.com\/",
"category":"category 1",
"position":"1",
},
{
"company":"Companyname 2",
"telephone":"2345678901",
"url":"http:\/\/www.companyname2.com\/",
"category":"category 2",
"position":"2",
},
{
"company":"Companyname 3",
"telephone":"3456789012",
"url":"http:\/\/www.companyname3.com\/",
"category":"category 3",
"position":"3",
}
]
}
Run Code Online (Sandbox Code Playgroud)
我在.h和我的.m文件中写什么?
谢谢你的帮助!:)
我是iOS开发的新手.我使用此代码连接到我的REST Web服务并以Json格式获取数据.
NSString *url=@"URL_Address";
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSURLResponse *resp = nil;
NSError *err = nil;
NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &err];
// NSString * theString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
// NSLog(@"response: %@", theString);
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: response options: NSJSONReadingMutableContainers error: &err];
if (!jsonArray) {
NSLog(@"Error parsing JSON: %@", err);
} else {
for(NSDictionary *item in jsonArray) {
NSLog(@" %@", item);
NSLog(@"---------------------------------");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想把它们分开objectForKey.我在循环中使用了这段代码:
NSString *name = [item …Run Code Online (Sandbox Code Playgroud) 我在几个项目中使用过这个......
[NSJSONSerialization dataWithJSONObject:someObject options:0 error:nil]
Run Code Online (Sandbox Code Playgroud)
但我不知道如何指定no options.这既适合阅读,也适合写作.
我在某个地方看到了一个例子,在这个地方,这个人使用了一个恒定值,而不是仅仅是0我找不到它.
有没有办法正确指定没有选项?
如果我使用上面的代码,AppCode会显示警告.
在花了太多时间试图找到最佳实践之后,我再次寻求一些帮助,希望我不是唯一一个在这方面苦苦挣扎的人:
我有这样的NSManaged Objects:
import Foundation
import CoreData
class Credential: NSManagedObject {
@NSManaged var credentialArrivalDate: String?
@NSManaged var credentialBarCode: String?
@NSManaged var credentialComment: String?
@NSManaged var credentialCountCheckIn: Int
@NSManaged var credentialCountCheckOut: Int
@NSManaged var credentialDepartureDate: String?
@NSManaged var credentialId: String?
@NSManaged var credentialIsArrived: Bool
@NSManaged var credentialIsCheckedOut: Bool
@NSManaged var credentialIsHost: Bool
@NSManaged var credentialLastModificationDate: String?
@NSManaged var credentialMemberControlled: String?
@NSManaged var credentialNumberOfPeople: Int
@NSManaged var credentialRSVP: Int
@NSManaged var credentialTypeId: String?
@NSManaged var credentialTypeName: String?
@NSManaged var credentialZoneId: String?
@NSManaged …Run Code Online (Sandbox Code Playgroud) 我想写一个扩展名NSDictionary,所以我可以轻松地从数据中创建它.我这样写的:
extension Dictionary {
init?(data: NSData?) {
guard let data = data else { return nil }
// TODO: This leaks.
if let json = (try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())) as? Dictionary {
self = json
}
else { return nil }
}
}
Run Code Online (Sandbox Code Playgroud)
无法找出泄漏的原因.有任何想法吗?
我最近开始研究内存泄漏,但我无法弄清楚JSON序列化导致泄漏的原因.
class func convertDataToDictionary(resultData: NSData) -> [String:AnyObject]{
do{
let json = try NSJSONSerialization.JSONObjectWithData(resultData, options: .AllowFragments) as? [String:AnyObject]
if json != nil{
return json!
}
}
catch{
print(error)
}
return [String:AnyObject]()
}
Run Code Online (Sandbox Code Playgroud)
我正在使用此函数将NSData转换为字典.我还附上了漏洞的截图.
这不会导致应用程序出现任何重大问题,但我仍然想知道它为什么会发生这种情况.任何帮助表示赞赏.谢谢!
我正在尝试将Google建议用于希腊语,但如果建议中包含英语以外的字符,则会收到错误消息.
如果查询是" magni ",例如响应将包含希腊词" μαγνήσιο "作为建议.试试吧
错误是:
Error Domain = NSCocoaErrorDomain Code = 261"无法使用Unicode(UTF-8)文本编码打开文件"search"." UserInfo = {NSURL = http://suggestqueries.google.com/complete/search?q=magni&client=toolbar&hl=el,NSStringEncoding = 4}
方法是:
+ (NSArray *)suggestionsForQuery:(NSString *)query
{
query = [query stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSString *URLString = [NSString stringWithFormat:@"http://suggestqueries.google.com/complete/search?q=%@&client=toolbar&hl=%@", query, @"el"]; // el is for greek
NSError *error = nil;
NSString *XMLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:URLString] encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"Error: %@", error.description);
}
else {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
将编码设置为NSUTF16StringEncoding但我有一些中文字符.
NSJSONSerialization通过设置"toolbar = firefox"来获得JSON响应但我得到了同样的错误.
错误域= NSCocoaErrorDomain代码= 3840"无法将数据转换为字符40周围的字符串." …
我们经常希望使用JSON来实现人类可读性.因此,通常要求在Go中,在.NET中,在Python中,在Java中按字母顺序(或字母数字)对JSON键进行排序,...
但是如何在Swift中按字母顺序输出带有JSON键的JSON?
PrettyPrinted输出很简单:
JSONSerialization.writeJSONObject(jsonObject, to: outputStream, options: [.prettyPrinted], error: nil)
Run Code Online (Sandbox Code Playgroud)
然而,按键不按字母顺序排列以供人类阅读.它们很可能是由NSDictionary.keyEnumerator()给出的顺序.但遗憾的是,我们不能在Swift中继承Dictionary,NSDictionary或CFDictionary,因此我们无法覆盖键顺序的行为.
[编辑:实际上,我们可以继承NSDictionary,请参阅下面的一个答案]
TL; DR
有没有一种方法可以使用JSONDecoder并编写一个函数,它只是从给定的json读出指定的可解码类型的字段值?
成像我有以下json:
{
"product":{
"name":"PR1",
"price":20
},
"employee":{
"lastName":"Smith",
"department":"IT",
"manager":"Anderson"
}
}
Run Code Online (Sandbox Code Playgroud)
我有2个Decodable结构:
struct Product: Decodable {
var name: String
var price: Int
}
struct Employee: Decodable {
var lastName: String
var department: String
var manager: String
}
Run Code Online (Sandbox Code Playgroud)
我想写一个函数
func getValue<T:Decodable>(from json: Data, field: String) -> T { ... }
Run Code Online (Sandbox Code Playgroud)
所以我可以这样称呼它:
let product: Product = getValue(from: myJson, field: "product")
let employee: Employee = getValue(from: myJson, field: "employee")
Run Code Online (Sandbox Code Playgroud)
这是可能的,JSONDecoder或者我应该弄乱JSONSerialization,首先读出给定json的"子树",然后将其传递给解码器?在swift中似乎不允许在泛型函数中定义结构.
我正在开发一个 iOS 应用程序,使用 swift 4.0(4.2 有同样的问题)。
我为 Encodable 添加了扩展
extension Encodable{
func toDict() throws -> [String:Any]? {
let jsonEncoder = JSONEncoder()
let jsonData = try jsonEncoder.encode(self)
do{
return try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any]
}
catch{
return nil
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个 Encodable 类的实例,它的属性也属于 Encodable 类,并注意到在instance.toDict()经常调用时,我的应用程序使用的内存增加了很多。即使我不使用返回的结果也是如此,如果我返回 nil 并忽略JSONSerialization.jsonObject.
我确定是这一行导致了问题(忽略结果并返回 nil 仍然会导致问题,注释该行并返回 nil 将停止内存增加。
随着时间的推移,内存越来越大,toDict()被调用的次数也越来越多,我最终在 10 分钟内使用了 400MB。
有没有人遇到过这个问题?有解决办法吗?
ios ×6
swift ×6
json ×4
memory-leaks ×3
objective-c ×3
iphone ×2
core-data ×1
encoding ×1
ios5 ×1
jsondecoder ×1
nsstring ×1
unicode ×1
xcode4.3 ×1