2011-07-12 36 views
5

Tôi đang xây dựng một ứng dụng điều chỉnh ngã ba. Các ngã ba nên cho phép lên đến 12 nốt nhạc đặt trước.Phân tích cú pháp tệp JSON bằng cách sử dụng JSONKit

Hơn nữa, tôi muốn cho phép người dùng chọn chủ đề. Mỗi chủ đề sẽ tải một tập hợp các cài đặt trước (không cần thiết để sử dụng tất cả chúng).

tập tin cấu hình của tôi sẽ giống như thế này *:


theme: "A3" 
comment: "An octave below concert pitch (ie A4 440Hz)" 
presets: { 
    A3 220Hz=220.0 
} 

// http://en.wikipedia.org/wiki/Guitar_tuning 
theme: "Guitar Standard Tuning" 
comment:"EADGBE using 12-TET tuning" 
presets: { 
    E2=82.41 
    A2=110.00 
    D3=146.83 
    G3=196.00 
    B3=246.94 
    E4=329.63 
} 

theme: "Bass Guitar Standard Tuning" 
comment: "EADG using 12-TET tuning" 
presets: { 
    E1=41.204 
    A2=55.000 
    D3=73.416 
    G3=97.999 
} 

... mà cần phải được tách ra thành một số cấu trúc như thế này:


@class Preset 
{ 
    NSString* label; 
    double freq; 
} 

@class Theme 
{ 
    NSString* label; 
    NSMutableArray* presets; 
} 

NSMutableArray* themes; 

Làm cách nào để ghi tệp của mình bằng JSON? (Tôi muốn tạo tối thiểu việc gõ vào một phần của người dùng - làm cách nào tôi có thể nhận được nó? Ai đó có thể cho tôi một ví dụ cho chủ đề đầu tiên?)

Và làm cách nào để phân tích nó thành cấu trúc sử dụng https://github.com/johnezang/JSONKit?

+0

Ví dụ JSON không đúng định dạng – Simeon

+0

Đọc câu hỏi cẩn thận hơn (từ thứ hai đến đoạn cuối). Tôi chưa bao giờ viết JSON, tôi thậm chí không biết về nó cho đến một giờ trước. –

+0

Xin lỗi, tôi nghĩ bạn đang tìm mã Objective-C (nhập đối tượng được phân tích cú pháp vào cấu trúc Objective-C) – Simeon

Trả lời

10

Dưới đây là một ví dụ valid JSON dựa trên suy nghĩ của bạn:

[ 
    { 
     "name": "Guitar Standard Tuning", 
     "comment": "EADGBE using 12-TET tuning", 
     "presets": { 
      "E2": "82.41", 
      "A2": "110.00", 
      "D3": "146.83", 
      "G3": "196.00", 
      "B3": "246.94", 
      "E4": "329.63" 
     } 
    }, 
    { 
     "name": "Bass Guitar Standard Tuning", 
     "comment": "EADG using 12-TET tuning", 
     "presets": { 
      "E1": "41.204", 
      "A1": "55.000", 
      "D2": "73.416", 
      "G2": "97.999" 
     } 
    } 
] 

Đọc một tập tin và phân tích sử dụng JSONKit:

NSData* jsonData = [NSData dataWithContentsOfFile: path]; 
JSONDecoder* decoder = [[JSONDecoder alloc] 
          initWithParseOptions:JKParseOptionNone]; 
NSArray* json = [decoder objectWithData:jsonData]; 

Sau đó, bạn sẽ phải lặp qua các biến json sử dụng một vòng lặp for.

+0

Cảm ơn! Điều này thực sự hữu ích! Có phải không thể tránh khỏi khi sử dụng một dấu "ở khắp mọi nơi" –

+1

Không, đó là một phần của định dạng JSON: http: //www.json.org/ – Simeon

+1

Có một lỗi trong câu trả lời: nó phải là một NSArray không phải là một NSMutableDictionary. Nó là một mảng các đối tượng từ điển. –

6

Sử dụng trình phân tích cú pháp trong câu hỏi của bạn và giả sử bạn có chuỗi Simeon trong biến NSString. Dưới đây là làm thế nào để phân tích nó:

#import "JSONKit.h" 


id parsedJSON = [myJSONString objectFromJSONString]; 

Điều đó sẽ cung cấp cho bạn một hệ thống các mảng và từ điển mà bạn có thể đi bộ để có được PresetTheme của bạn đối tượng. Trong trường hợp trên, bạn sẽ nhận được một mảng với hai từ điển, mỗi từ có một phím name, commentpresets. Hai giá trị đầu tiên sẽ có giá trị NSString và giá trị thứ ba (presets) sẽ có từ điển vì giá trị của nó với tên ghi chú là khóa và tần số làm giá trị (như NSString đối tượng).

Các vấn đề liên quan