2011-07-12 17 views
5

Estoy construyendo una aplicación de diapasón. La horquilla debería permitir hasta 12 pasos preestablecidos.Analizando el archivo JSON usando JSONKit

Además, deseo permitir que el usuario elija un tema. Cada tema cargará un conjunto de presets (no es necesario usarlos todos).

Mi fichero de configuración sería algo como esto *:


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 
} 

... que necesitan ser extraído en alguna estructura como esta:


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

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

NSMutableArray* themes; 

¿Cómo escribo mi archivo usando JSON? (Me gustaría crear un mínimo de mecanografía por parte del usuario, ¿qué tan breve puedo obtenerlo? ¿Alguien podría darme un ejemplo para el primer tema?)

Y cómo lo analizo en las estructuras usando https://github.com/johnezang/JSONKit?

+0

El ejemplo de JSON está mal formado – Simeon

+0

Lea la pregunta con más cuidado (del penúltimo párrafo). Nunca escribí JSON, ni siquiera lo supe hasta hace una hora. –

+0

Lo siento, pensé que estabas buscando el código Objective-C (importando el objeto analizado en tu estructura Objective-C) – Simeon

Respuesta

10

Aquí está un ejemplo valid JSON basado en sus pensamientos:

[ 
    { 
     "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" 
     } 
    } 
] 

Leer un archivo y analizar usando JSONKit:

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

Después de eso, usted tiene que iterar sobre la variable json usando un bucle for.

+0

¡Gracias! ¡Esto es realmente útil! ¿Es inevitable usar un gadzillion "marks everywhere? –

+1

No, es parte del formato JSON: http: //www.json.org/ – Simeon

+1

Hay un error en la respuesta: debe ser un NSArray no un NSMutableDictionary. Es una matriz de objetos de diccionario. –

6

Usando el analizador en su pregunta y suponiendo que tiene la cadena de Simeon en una variable NSString. Así es como para analizarlo:

#import "JSONKit.h" 


id parsedJSON = [myJSONString objectFromJSONString]; 

qué le dará una jerarquía de las matrices y los diccionarios que se puede caminar para conseguir sus Preset y Theme objetos. En el caso anterior, obtendría una matriz con dos diccionarios, cada uno con una clave name, comment y presets. Los primeros dos tendrán valores de NSString y el tercero (presets) tendrá un diccionario como valor con el nombre de la nota como claves y las frecuencias como valores (como objetos NSString).