Phân tích cú pháp thuộc tính truy vấn NSURL


82

Tôi có một URL như myApp://action/1?parameter=2&secondparameter=3

Với truy vấn thuộc tính, tôi nhận được sau một phần của URL

parameter=2&secondparameter=3

Có cách nào dễ dàng để đặt điều này trong một NSDictionaryhoặc một Array?

Cảm ơn nhiều

Câu trả lời:


54

Đại loại vậy:

NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
for (NSString *param in [url componentsSeparatedByString:@"&"]) {
  NSArray *elts = [param componentsSeparatedByString:@"="];
  if([elts count] < 2) continue;
  [params setObject:[elts lastObject] forKey:[elts firstObject]];
}

Lưu ý : Đây là mã mẫu. Tất cả các trường hợp lỗi không được quản lý.


2
Mã này sẽ bị lỗi trong trường hợp truy vấn không đúng định dạng. Xem giải pháp an toàn bên dưới.
BadPirate

2
Ok, bạn chỉ cần thêm một kiểm tra về kích thước mảng! Mã này chỉ là một khởi đầu (như mọi khi trên SO). Nếu bạn muốn tuân thủ tất cả các URL, bạn có nhiều công việc hơn để xử lý các chuỗi thoát, phân đoạn (# phần ở cuối), ...
Benoît

Đưa vào một chỉnh sửa cho bạn. Chỉ bỏ phiếu xuống để thu hút sự chú ý của bạn đến vấn đề có câu trả lời. Sau khi quá trình chỉnh sửa hoàn tất, tôi sẽ có thể hiển thị lại.
BadPirate

1
Mã này thậm chí không gần đúng ngoại trừ các giá trị chữ hoa và chữ thường đơn giản nhất không có ký tự đặc biệt.
Nick Snyder

Bạn nên sử dụng đối tượng cuối cùng & đầu tiên thay vì: [params setObject:[elts lastObject] forKey:[elts firstObject]];nó an toàn hơn
Laszlo

147

Bạn có thể sử dụng queryItemstrong URLComponents.

Khi bạn nhận được giá trị của thuộc tính này, lớp NSURLComponents phân tích chuỗi truy vấn và trả về một mảng các đối tượng NSURLQueryItem, mỗi đối tượng đại diện cho một cặp khóa-giá trị, theo thứ tự xuất hiện trong chuỗi truy vấn ban đầu.

Nhanh

let url = "http://example.com?param1=value1&param2=param2"
let queryItems = URLComponents(string: url)?.queryItems
let param1 = queryItems?.filter({$0.name == "param1"}).first
print(param1?.value)

Ngoài ra, bạn có thể thêm tiện ích mở rộng trên URL để làm mọi thứ dễ dàng hơn.

extension URL {
    var queryParameters: QueryParameters { return QueryParameters(url: self) }
}

class QueryParameters {
    let queryItems: [URLQueryItem]
    init(url: URL?) {
        queryItems = URLComponents(string: url?.absoluteString ?? "")?.queryItems ?? []
        print(queryItems)
    }
    subscript(name: String) -> String? {
        return queryItems.first(where: { $0.name == name })?.value
    }
}

Sau đó, bạn có thể truy cập tham số theo tên của nó.

let url = "http://example.com?param1=value1&param2=param2"
print(url.queryParameters["param1"])

11
truy vấn kể từ iOS7. queryItems kể từ iOS8.
Onato

Cảm ơn vì câu trả lời này. Thêm vào đó, tôi thấy các bài viết sau đây rất hữu ích để tìm hiểu thêm về NSURLComponents: nshipster.com/nsurl
xaphod

Câu trả lời chính xác. Cảm ơn!
dpigera

Thật kỳ lạ, NSURLComponents không hoạt động nếu có ký tự # trong URL. Giống như http://example.com/abc#abc?param1=value1&param2=param2 queryItems sẽ nil
Pedro

Đó là vì phân đoạn (#abc) thuộc về cuối.
Onato

55

Tôi có lý do để viết một số tiện ích mở rộng cho hành vi này có thể hữu ích. Đầu tiên là tiêu đề:

#import <Foundation/Foundation.h>

@interface NSString (XQueryComponents)
- (NSString *)stringByDecodingURLFormat;
- (NSString *)stringByEncodingURLFormat;
- (NSMutableDictionary *)dictionaryFromQueryComponents;
@end

@interface NSURL (XQueryComponents)
- (NSMutableDictionary *)queryComponents;
@end

@interface NSDictionary (XQueryComponents)
- (NSString *)stringFromQueryComponents;
@end

Các phương thức này mở rộng NSString, NSURL và NSDictionary, để cho phép bạn chuyển đổi sang và từ các chuỗi thành phần truy vấn và các đối tượng từ điển chứa kết quả.

Bây giờ là mã .m liên quan:

#import "XQueryComponents.h"

@implementation NSString (XQueryComponents)
- (NSString *)stringByDecodingURLFormat
{
    NSString *result = [self stringByReplacingOccurrencesOfString:@"+" withString:@" "];
    result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}

- (NSString *)stringByEncodingURLFormat
{
    NSString *result = [self stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}

- (NSMutableDictionary *)dictionaryFromQueryComponents
{
    NSMutableDictionary *queryComponents = [NSMutableDictionary dictionary];
    for(NSString *keyValuePairString in [self componentsSeparatedByString:@"&"])
    {
        NSArray *keyValuePairArray = [keyValuePairString componentsSeparatedByString:@"="];
        if ([keyValuePairArray count] < 2) continue; // Verify that there is at least one key, and at least one value.  Ignore extra = signs
        NSString *key = [[keyValuePairArray objectAtIndex:0] stringByDecodingURLFormat];
        NSString *value = [[keyValuePairArray objectAtIndex:1] stringByDecodingURLFormat];
        NSMutableArray *results = [queryComponents objectForKey:key]; // URL spec says that multiple values are allowed per key
        if(!results) // First object
        {
            results = [NSMutableArray arrayWithCapacity:1];
            [queryComponents setObject:results forKey:key];
        }
        [results addObject:value];
    }
    return queryComponents;
}
@end

@implementation NSURL (XQueryComponents)
- (NSMutableDictionary *)queryComponents
{
    return [[self query] dictionaryFromQueryComponents];
}
@end

@implementation NSDictionary (XQueryComponents)
- (NSString *)stringFromQueryComponents
{
    NSString *result = nil;
    for(__strong NSString *key in [self allKeys])
    {
        key = [key stringByEncodingURLFormat];
        NSArray *allValues = [self objectForKey:key];
        if([allValues isKindOfClass:[NSArray class]])
            for(__strong NSString *value in allValues)
            {
                value = [[value description] stringByEncodingURLFormat];
                if(!result)
                    result = [NSString stringWithFormat:@"%@=%@",key,value];
                else 
                    result = [result stringByAppendingFormat:@"&%@=%@",key,value];
            }
        else {
            NSString *value = [[allValues description] stringByEncodingURLFormat];
            if(!result)
                result = [NSString stringWithFormat:@"%@=%@",key,value];
            else 
                result = [result stringByAppendingFormat:@"&%@=%@",key,value];
        }
    }
    return result;
}
@end

hai vấn đề: 1) bạn phải giải mã URL cả khóa và giá trị trước khi lưu chúng vào từ điển và 2) theo quy tắc của URL, bạn được phép chỉ định cùng một khóa nhiều lần. IOW, nó phải là một khóa được ánh xạ tới một mảng giá trị, không phải một giá trị duy nhất.
Dave DeLong

Ok, bạn chỉ cần thêm một kiểm tra về kích thước mảng (có yêu cầu bỏ phiếu xuống cho câu trả lời của tôi không?)! Mã này chỉ là một khởi đầu (như mọi khi trên SO). Nếu bạn muốn tuân thủ tất cả các URL, bạn có nhiều công việc hơn để xử lý các chuỗi thoát, phân đoạn (# phần ở cuối), ...
Benoît

Dave - Điểm tốt. Không bắt buộc đối với nhu cầu của tôi, nhưng vì tôi đang cố gắng đưa ra câu trả lời phù hợp với mọi người đang truy cập về vấn đề phổ biến này nên tôi đã đưa vào chức năng đã đề cập ... Benoit - Chỉ kêu gọi sự chú ý của bạn đến vấn đề bằng câu trả lời của bạn, Tôi đã gửi một bản chỉnh sửa. Có lẽ không phải là hình thức tốt nhất để sử dụng để kêu gọi sự chú ý đến các vấn đề nhỏ trong các câu trả lời hay, tôi sẽ không làm như vậy trong tương lai .. Không thể thay đổi phiếu bầu cho đến khi bản chỉnh sửa được thông qua: /
BadPirate

Trong stringByDecodingURLFormat, loại cho 'kết quả' phải là NSString *.
ThomasW

Chỉ cần nhận thấy một vấn đề khác. Khóa và giá trị đang bị trộn lẫn, khóa phải là objectAtIndex: 0 và giá trị là objectAtIndex: 1.
ThomasW

13

Thử đi ;)!

NSString *query = @"parameter=2&secondparameter=3"; // replace this with [url query];
NSArray *components = [query componentsSeparatedByString:@"&"];
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
for (NSString *component in components) {
    NSArray *subcomponents = [component componentsSeparatedByString:@"="];
    [parameters setObject:[[subcomponents objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
                   forKey:[[subcomponents objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}

1
Cũng lưu ý - ngoài vấn đề sự cố được BadPirate lưu ý - (1) mà khóa / giá trị từ điển bị đảo ngược; (2) các khóa / giá trị vẫn được mã hóa, do đó bạn muốn làm stringByDecodingURLFormat
dpjanes

Cách thực sự thoải mái để làm việc đó
Burf2000

9

Tất cả các bài viết trước đây không mã hóa url đúng cách. Tôi sẽ đề xuất các phương pháp sau:

+(NSString*)concatenateQuery:(NSDictionary*)parameters {
    if([parameters count]==0) return nil;
    NSMutableString* query = [NSMutableString string];
    for(NSString* parameter in [parameters allKeys])
        [query appendFormat:@"&%@=%@",[parameter stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet],[[parameters objectForKey:parameter] stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]];
    return [[query substringFromIndex:1] copy];
}
+(NSDictionary*)splitQuery:(NSString*)query {
    if([query length]==0) return nil;
    NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    for(NSString* parameter in [query componentsSeparatedByString:@"&"]) {
        NSRange range = [parameter rangeOfString:@"="];
        if(range.location!=NSNotFound)
            [parameters setObject:[[parameter substringFromIndex:range.location+range.length] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey:[[parameter substringToIndex:range.location] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        else [parameters setObject:[[NSString alloc] init] forKey:[parameter stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    }
    return [parameters copy];
}

if(!query||[query length] == 0)là thừa. Bạn có thể kiểm tra một cách an toàn if([query length] == 0)nếu trong trường hợp đó query == nil, nó sẽ trả về giá trị 0nếu bạn thử gọi độ dài trên đó.
JRG-Developer

Điều này không nên sử dụng objectForKey và không phải valueforkey?
slf 24/09/2013

Mã đẹp. Tôi đề nghị sử dụng NSUTF8StringEncodingtrong splitQueryđể hỗ trợ tất cả các bảng mã :) Ngoài ra, [string stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]là một cách mã hóa mới hơn cho concatenateQuery.
William Denniss

Tôi nghĩ rằng thực hành tốt là trả về một cá thể không thay đổi, vì vậy có lẽ bạn nên thay đổi dòng cuối cùng để trả về [bản sao tham số];
Glenn Howes

Cảm ơn. Tôi đã điều chỉnh mã theo ý kiến ​​của bạn!
Kristian Kraljic

7

Đây là phần mở rộng nhanh chóng:

extension NSURL{
        func queryParams() -> [String:AnyObject] {
            var info : [String:AnyObject] = [String:AnyObject]()
            if let queryString = self.query{
                for parameter in queryString.componentsSeparatedByString("&"){
                    let parts = parameter.componentsSeparatedByString("=")
                    if parts.count > 1{
                        let key = (parts[0] as String).stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
                        let value = (parts[1] as String).stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
                        if key != nil && value != nil{
                            info[key!] = value
                        }
                    }
                }
            }
            return info
        }
    }

7

Theo câu trả lời đã rất rõ ràng của Onato, tôi đã viết một phần mở rộng cho NSURL bằng Swift, nơi bạn có thể nhận được một tham số truy vấn như sau:

ví dụ: URL chứa cặp param = some_value

let queryItem = url.queryItemForKey("param")
let value = queryItem.value // would get String "someValue"

Phần mở rộng trông giống như:

extension NSURL {

  var allQueryItems: [NSURLQueryItem] {
      get {
          let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false)!
          let allQueryItems = components.queryItems!
          return allQueryItems as [NSURLQueryItem]
      }
  }

  func queryItemForKey(key: String) -> NSURLQueryItem? {

      let predicate = NSPredicate(format: "name=%@", key)!
      return (allQueryItems as NSArray).filteredArrayUsingPredicate(predicate).first as? NSURLQueryItem

  }
}

Đây là câu trả lời tốt nhất! Tại sao họ không kiểm tra tài liệu api?
Jamin Zhang

5

Đối với những người sử dụng Bolts Framework, bạn có thể sử dụng:

NSDictionary *parameters = [BFURL URLWithURL:yourURL].inputQueryParameters;

Hãy nhớ nhập:

#import <Bolts/BFURL.h>

Nếu bạn tình cờ có Facebook SDK trong dự án của mình, bạn cũng có Bu lông . Facebook đang sử dụng khuôn khổ này như một phụ thuộc.


Trong Swift với bu lông:BFURL(url: url)?.inputQueryParameters?["myKey"] as? String
JAL

4

Cách ưa thích để xử lý các URL bây giờ là NSURLComponents. Cụ thể là thuộc queryItemstính trả về một NSArraytrong các tham số.

Nếu bạn muốn các tham số trong a NSDictionary, đây là một phương pháp:

+(NSDictionary<NSString *, NSString *>*)queryParamsFromURL:(NSURL*)url
{
    NSURLComponents* urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];

    NSMutableDictionary<NSString *, NSString *>* queryParams = [NSMutableDictionary<NSString *, NSString *> new];
    for (NSURLQueryItem* queryItem in [urlComponents queryItems])
    {
        if (queryItem.value == nil)
        {
            continue;
        }
        [queryParams setObject:queryItem.value forKey:queryItem.name];
    }
    return queryParams;
}

Lưu ý: URL có thể có các tham số lặp lại, nhưng từ điển sẽ chỉ chứa giá trị cuối cùng của bất kỳ tham số trùng lặp nào. Nếu điều đó là không mong muốn, hãy sử dụng queryItemsmảng trực tiếp.


3

Swift 2.1

Lót:

"p1=v1&p2=v2".componentsSeparatedByString("&").map {
    $0.componentsSeparatedByString("=") 
}.reduce([:]) {
    (var dict: [String:String], p) in
    dict[p[0]] = p[1]
    return dict
}

// ["p1": "v1", "p2": "v2"]

Được sử dụng làm phần mở rộng trên NSURL:

extension NSURL {

    /**
     * URL query string as dictionary. Empty dictionary if query string is nil.
     */
    public var queryValues : [String:String] {
        get {
            if let q = self.query {
                return q.componentsSeparatedByString("&").map {
                    $0.componentsSeparatedByString("=") 
                }.reduce([:]) {
                    (var dict: [String:String], p) in
                    dict[p[0]] = p[1]
                    return dict
                }
            } else {
                return [:]
            }
        }
    }

}

Thí dụ:

let url = NSURL(string: "http://example.com?p1=v1&p2=v2")!
let queryDict = url.queryValues

// ["p1": "v1", "p2": "v2"]

Xin lưu ý, nếu sử dụng OS X 10.10 hoặc iOS 8 (hoặc mới hơn), có lẽ tốt hơn nên sử dụng NSURLComponentsthuộc queryItemstính và tạo từ điển từ NSURLQueryItemstrực tiếp.

Đây là một giải pháp mở rộng NSURLComponentsdựa trên NSURL:

extension NSURL {

    /// URL query string as a dictionary. Empty dictionary if query string is nil.
    public var queryValues : [String:String] {
        get {
            guard let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false) else {
                return [:]
            }

            guard let queryItems = components.queryItems else {
                return [:]
            }

            var result:[String:String] = [:]
            for q in queryItems {
                result[q.name] = q.value
            }
            return result
        }
    }

}

Chú thích cuối trang cho phần mở rộng NSURL là trong Swift thực sự có thể đặt thuộc tính trùng tên với thuộc tính chuỗi hiện có— query. Tôi không biết cho đến khi tôi thử nó, nhưng tính đa hình trong Swift cho phép bạn chỉ khác nhau về kiểu trả về. Vì vậy, nếu thuộc tính NSURL mở rộng thì public var query: [String:String]nó hoạt động. Tôi đã không sử dụng điều này trong ví dụ vì tôi thấy nó hơi điên rồ, nhưng nó hoạt động ...


2

Tôi đã xuất bản một lớp học đơn giản thực hiện công việc dưới MIT:

https://github.com/anegmawad/URLQueryToCocoa

Với nó, bạn có thể có các mảng và đối tượng trong truy vấn, được thu thập và dán lại với nhau

Ví dụ

users[0][firstName]=Amin&users[0][lastName]=Negm&name=Devs&users[1][lastName]=Kienle&users[1][firstName]=Christian

sẽ trở thành:

@{
   name : @"Devs",
   users :
   @[
      @{
         firstName = @"Amin",
         lastName = @"Negm"
      },
      @{
         firstName = @"Christian",
         lastName = @"Kienle"
      }
   ]
 }

Bạn có thể coi nó như là một đối tác truy vấn URL của NSJSONSerializer.


công việc xuất sắc. Đây dường như là câu trả lời đúng duy nhất (câu trả lời có tính đến các giá trị mảng và dict).
Anton Tropashko

2

Có vẻ như bạn đang sử dụng nó để xử lý dữ liệu đến từ một ứng dụng iOS khác. Nếu vậy, đây là những gì tôi sử dụng cho cùng một mục đích.

Cuộc gọi ban đầu (ví dụ: trong ứng dụng bên ngoài):

UIApplication *application = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"myApp://action/1?parameter=2&secondparameter=3"];
if ([application canOpenURL:url]) {
    [application openURL:url];
    NSLog(@"myApp is installed");
} else {
    NSLog(@"myApp is not installed");
}

Phương pháp trích xuất dữ liệu QueryString từ NSURL và lưu dưới dạng NSDictionary:

-(NSDictionary *) getNSDictionaryFromQueryString:(NSURL *)url {
   NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
   NSRange needle = [url.absoluteString rangeOfString:@"?" options:NSCaseInsensitiveSearch];
   NSString *data = nil;

   if(needle.location != NSNotFound) {
       NSUInteger start = needle.location + 1;
       NSUInteger end = [url.absoluteString length] - start;
       data = [url.absoluteString substringWithRange:NSMakeRange(start, end)];
   }

   for (NSString *param in [data componentsSeparatedByString:@"&"]) {
       NSArray *keyvalue = [param componentsSeparatedByString:@"="];
       if([keyvalue count] == 2){
           [result setObject:[keyvalue objectAtIndex:1] forKey:[keyvalue objectAtIndex:0]];
       }
   }

  return result;
}

Sử dụng:

NSDictionary *result = [self getNSDictionaryFromQueryString:url];

0

Lớp này là một giải pháp tốt để phân tích cú pháp url.

tệp .h

@interface URLParser : NSObject {
    NSArray *variables;
}

@property (nonatomic, retain) NSArray *variables;

- (id)initWithURLString:(NSString *)url;
- (NSString *)valueForVariable:(NSString *)varName;

@end

tệp .m

#import "URLParser.h"

@implementation URLParser
@synthesize variables;

- (id) initWithURLString:(NSString *)url{
    self = [super init];
    if (self != nil) {
        NSString *string = url;
        NSScanner *scanner = [NSScanner scannerWithString:string];
        [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
        NSString *tempString;
        NSMutableArray *vars = [NSMutableArray new];
        [scanner scanUpToString:@"?" intoString:nil];       //ignore the beginning of the string and skip to the vars
        while ([scanner scanUpToString:@"&" intoString:&tempString]) {
            [vars addObject:[tempString copy]];
        }
        self.variables = vars;
    }
    return self;
}

- (NSString *)valueForVariable:(NSString *)varName {
    for (NSString *var in self.variables) {
        if ([var length] > [varName length]+1 && [[var substringWithRange:NSMakeRange(0, [varName length]+1)] isEqualToString:[varName stringByAppendingString:@"="]]) {
            NSString *varValue = [var substringFromIndex:[varName length]+1];
            return varValue;
        }
    }
    return nil;
}

@end

0

Hendrik đã viết một ví dụ tuyệt vời cho phần mở rộng trong câu hỏi này, tuy nhiên tôi phải viết lại nó để không sử dụng bất kỳ phương pháp thư việnjective-c nào. Sử dụng NSArraynhanh không phải là cách tiếp cận chính xác.

Đây là kết quả, tất cả đều nhanh chóng và an toàn hơn một chút. Ví dụ sử dụng sẽ ít dòng mã hơn với Swift 1.2.

public extension NSURL {
    /*
    Set an array with all the query items
    */
    var allQueryItems: [NSURLQueryItem] {
        get {
            let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false)!
            if let allQueryItems = components.queryItems {
                return allQueryItems as [NSURLQueryItem]
            } else {
                return []
            }
        }
    }

    /**
    Get a query item form the URL query

    :param: key The parameter to fetch from the URL query

    :returns: `NSURLQueryItem` the query item
    */
    public func queryItemForKey(key: String) -> NSURLQueryItem? {
        let filteredArray = filter(allQueryItems) { $0.name == key }

        if filteredArray.count > 0 {
            return filteredArray.first
        } else {
            return nil
        }
    }
}

Sử dụng:

let queryItem = url.queryItemForKey("myItem")

Hoặc, cách sử dụng chi tiết hơn:

if let url = NSURL(string: "http://www.domain.com/?myItem=something") {
    if let queryItem = url.queryItemForKey("myItem") {
        if let value = queryItem.value {
            println("The value of 'myItem' is: \(value)")
        }
    }
}

0

thử đi:

-(NSDictionary *)getUrlParameters:(NSString *)url{
    NSArray *justParamsArr = [url componentsSeparatedByString:@"?"];
    url = [justParamsArr lastObject];
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
    for (NSString *param in [url componentsSeparatedByString:@"&"]) {
        NSArray *elts = [param componentsSeparatedByString:@"="];
        if([elts count] < 2) continue;
        [params setObject:[elts lastObject] forKey:[elts firstObject]];
    }
    return params;
}

0

Cách tiếp cận khá nhỏ gọn:

    func stringParamsToDict(query: String) -> [String: String] {
        let params = query.components(separatedBy: "&").map {
            $0.components(separatedBy: "=")
        }.reduce(into: [String: String]()) { dict, pair in
            if pair.count == 2 {
                dict[pair[0]] = pair[1]
            }
        }
        return params
    }

-5

Giải pháp mạnh mẽ nhất nếu bạn đang sử dụng URL để truyền dữ liệu từ ứng dụng web đến điện thoại và bạn muốn chuyển mảng, số, chuỗi, ...

JSON mã hóa đối tượng của bạn bằng PHP

header("Location: myAppAction://".urlencode(json_encode($YOUROBJECT)));

Và JSON giải mã kết quả trong iOS

NSData *data = [[[request URL] host] dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *packed = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

1
đó là một ý tưởng khủng khiếp. URL có giới hạn độ dài có thể dễ dàng bị vượt quá nếu bạn đang tuần tự hóa JSON trong đó.
Michael Baldry

nó có khoảng 2000 ký tự
Michael Baldry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.