November 20, 2011

JSON บน iOS 5

ปัจจุบันเราคงปฏิเสธไม่ได้ว่าเราใช้ JSON กันบ่อยขึ้น และในวงกว้างขึ้นเรื่อยๆ
เดิมหากจะทำอะไรกับ JSON เราก็จะมักจะต้องพึ่งพา third party library อยู่เสมอ แต่เมื่อมาถึงยุคของ iOS 5  Apple ก็ได้เพิ่ม JSON library เข้ามาให้เราพร้อมใช้ได้ง่ายๆ แล้ว

ทำให้เราสามารถแปลง Object อย่าง NSString, NSNumber, NSArray หรือ NSDictionary ให้กลายเป็น JSON ได้ง่ายๆ โดยไม่จำเป็นต้องพึ่งพา third party library อีกต่อไป

พระเอกของงานนี้ก็คือ NSJSONSerialization  เราจะใช้มันช่วยในการแปลง Object ให้กลายเป็น JSON และแปลงจาก JSON กลับมาเป็น Object ได้ ดังนี้


แปลง JSON Data ให้กลายเป็น Object

    // สมมติว่าเราได้รับ data มาจากอินเทอร์เน็ต
    NSData* data = [NSData dataWithContentsOfURL: [NSURL URLWithString: urlString]];

    // แปลงเป็น Object ด้วยพระเอกของเรา
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData: data
                                                     optionskNilOptions 
                                                       error: &error];


สำหรับ options ของการแปลง JSON ให้กลายเป็น Object นั้น จะเกี่ยวกับเรื่องการความต้องการให้สิ่งที่แปลงออกมามีลักษณะเป็นอย่างไรในลักษณะของ Mutable หรือ Immutable  และอยากจะให้ top level object แยกกันเป็น array หรือ dictionary หรือไม่ อ่านรายละเอียด options ได้ที่นี่


แปลง Object เป็น JSON Data

    // เริ่มจากเรามี Object ที่ต้องการแปลงเป็น JSON
    NSDictionary* objectInfo = ...

    // แปลงเป็น JSON ด้วยพระเอกของเรา
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject: objectInfo 
                                 optionsNSJSONWritingPrettyPrinted
                                   error: &error];

    // ลองดูหน้าตาของ JSON ที่เราแปลงได้
    NSString *jsonString = [[NSString allocinitWithData:jsonData
                                             encoding:NSUTF8StringEncoding];



กรณีนี้ถ้าหากเราต้องการส่งข้อมูลไปที่อื่นๆ เช่นส่งไปยัง server เราสามารถกำหนด option เป็น kNilOptions ได้ เพื่อตัดอักขระส่วนที่ไม่จำเป็นออกไป แต่ที่เรากำหนด options เป็น NSJSONWritingPrettyPrinted ก็เพื่อให้เราสามารถอ่านได้ง่ายนั่นเอง

เพียงเท่านี้เราก็สามารถทำงานร่วมกับ JSON ได้อย่างมีความสุขแล้ว