标签: nsjsonserialization

如何使用带有NSJSONSerialization类参考的xcode 4.3.1从URL获取数据

我试图了解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文件中写什么?

谢谢你的帮助!:)

iphone json ios nsjsonserialization xcode4.3

5
推荐指数
2
解决办法
4万
查看次数

使用iOS中的objectForKey使用NSJSONSerialization类解析json

我是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)

iphone objective-c ios ios5 nsjsonserialization

5
推荐指数
1
解决办法
2万
查看次数

没有选项的NSJSONSerialization

我在几个项目中使用过这个......

[NSJSONSerialization dataWithJSONObject:someObject options:0 error:nil]
Run Code Online (Sandbox Code Playgroud)

但我不知道如何指定no options.这既适合阅读,也适合写作.

我在某个地方看到了一个例子,在这个地方,这个人使用了一个恒定值,而不是仅仅是0我找不到它.

有没有办法正确指定没有选项?

如果我使用上面的代码,AppCode会显示警告.

objective-c ios nsjsonserialization

5
推荐指数
1
解决办法
3350
查看次数

iOS-Swift:将NSManagedObject序列化为JSON(带关系)

在花了太多时间试图找到最佳实践之后,我再次寻求一些帮助,希望我不是唯一一个在这方面苦苦挣扎的人:

我有这样的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)

json core-data ios nsjsonserialization swift

5
推荐指数
1
解决办法
4875
查看次数

使用NSJSONSerialization时Swift泄漏

我想写一个扩展名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)

无法找出泄漏的原因.有任何想法吗?

memory-leaks nsjsonserialization swift

5
推荐指数
1
解决办法
908
查看次数

NSJSONSerialization中的内存泄漏

我最近开始研究内存泄漏,但我无法弄清楚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转换为字典.我还附上了漏洞的截图.

在此输入图像描述

这不会导致应用程序出现任何重大问题,但我仍然想知道它为什么会发生这种情况.任何帮助表示赞赏.谢谢!

memory-leaks ios nsjsonserialization swift

5
推荐指数
0
解决办法
633
查看次数

请求Google建议时遇到问题

我正在尝试将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)

我试过了:

  1. 将编码设置为NSUTF16StringEncoding但我有一些中文字符.

  2. NSJSONSerialization通过设置"toolbar = firefox"来获得JSON响应但我得到了同样的错误.

错误域= NSCocoaErrorDomain代码= 3840"无法将数据转换为字符40周围的字符串." …

unicode encoding objective-c nsstring nsjsonserialization

5
推荐指数
0
解决办法
291
查看次数

在Swift中编写带有排序键的prettyPrinted JSON对象

我们经常希望使用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,请参阅下面的一个答案]

json nsjsonserialization swift

5
推荐指数
1
解决办法
1901
查看次数

在Swift中动态解码任意json字段

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中似乎不允许在泛型函数中定义结构.

json nsjsonserialization swift jsondecoder

5
推荐指数
1
解决办法
478
查看次数

JSONSerialization.jsonObject 导致 swift 4.0 和 4.2 中的内存泄漏

我正在开发一个 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。

有没有人遇到过这个问题?有解决办法吗?

memory-leaks ios nsjsonserialization swift

5
推荐指数
1
解决办法
1471
查看次数