2016-03-25 9 views
0

Temel verilerdeki kullanıcı tercihlerini kaydetmek için JSON yanıtının altında veriyorum.Daha iyi JSON Objective-c ve en iyi uygulamalarda ayrıştırma uygulaması?

preferences={ 
     1={ 
     children=({ 
      3=Samsung;4=Nokia; 
     });id=1;name=Mobiles; 
     };2={ 
     children=({ 
      5="Samsung Curve TV"; 
     });id=2;name=Electronics; 
     }; 
    }; 

İşte iyi çalışan kod snippet'im. Ama bence bu çok ayrıntılı bir kod.

NSLog(@"Preferences: %@", [response objectForKey:@"preferences"]); 

    for (NSDictionary *dic in [response objectForKey:@"preferences"]) { 
     NSLog(@"ID: %@", [[[response objectForKey:@"preferences"] objectForKey:dic] objectForKey:@"id"]); 
     NSLog(@"NAME: %@", [[[response objectForKey:@"preferences"] objectForKey:dic] objectForKey:@"name"]); 

     NSLog(@"Children DIC: %@", [[[[[response objectForKey:@"preferences"] 
            objectForKey:dic] objectForKey:@"children"] objectAtIndex:0] objectForKey:@"3"]); 

     for (NSDictionary *childDic in [[[[response objectForKey:@"preferences"] 
              objectForKey:dic] objectForKey:@"children"] objectAtIndex:0]) { 
      NSLog(@"Child Name: %@", [[[[[response objectForKey:@"preferences"] 
             objectForKey:dic] objectForKey:@"children"] objectAtIndex:0] objectForKey:childDic]); 
     } 
    } 

3 sorum var.

  1. Kod snippet'imi nasıl geliştirebilirim? Bunu uygulamak için daha kısa bir yol var mı?

  2. Bu JSON yanıtı mobil uç ayrıştırma için yeterince iyi mi? iyi JSON formatı mı? Çekirdek verileri kullanması açısından Mobil uygulama geliştiriciler olarak izlememiz gereken herhangi bir JSON yanıt biçimi var mı (DB uygulamasının en iyi uygulama olarak basitleştirilmesi)?

  3. Bunun gibi bir JSON dizesini Objective-c'den nasıl yeniden yapıyorum?

+0

diğer insanların nasıl yaptığını öğrenin, örneğin üçüncü taraf https://github.com/icanzilb/JSONModel – Injectios

+0

Sorunuzda yanıtınız var. – user3182143

+0

@Injectios önerileriniz, JSON yanıtı JSONModel'e dönüştürebilir miyim? JSONModel'in farkındayım ama bu cevabın bununla nasıl uyumlu olduğu hakkında hiçbir fikrim yok mu? – happycoder

cevap

0

Ok bu yüzden, (derin DEĞİL analiz için üzgünüm):

let prefs = json["preferences"] 
let userName = prefs["id"].stringValue 
let name = prefs["name"].stringValue 
let child = prefs["children"].arrayValue[0].arrayValue[3] 

https://github.com/SwiftyJSON/SwiftyJSON

Kolayca kendi JSON yapıları inşa edebilir ve Alamofire ile gönderebilirsiniz her şeyden önce JSON'unuzu dinamik ele almak için dictionary içermemesi ları (samsung 3 anahtar ve benzeri, olması gerektiği dizi vardır, mantıklı?)

Ben imho daha iyi JSON yapısı ile gelip:

{ 
    "preferences":[ 
     { 
     "items":[ 
      { 
      "id" : "3", 
      "name" : "Samsung" 
      }, 
      { 
      "id" : "3", 
      "name" : "Nokia" 
      } 
     ], 
     "id":"1", 
     "name":"Mobiles" 
     }, 
     { 
     "items":[ 
      { 
      "id" : "3", 
      "name" : "Nokia" 
      } 
     ], 
     "id":"2", 
     "name":"Electronics" 
     } 
] 
} 

O JSONModel ile nesnelere eşlemek şimdi gerçekten çok kolay ve dikkat etmeniz gereken tek bir şey anahtarların haritalanmasıdır.

NSString *JSONString = @" {  \"preferences\":[  {   \"items\":[   {    \"id\" : \"3\",    \"name\" : \"Samsung\"   },   {    \"id\" : \"3\",    \"name\" : \"Nokia\"   }   ],   \"id\":\"1\",   \"name\":\"Mobiles\"  },  {   \"items\":[   {    \"id\" : \"3\",    \"name\" : \"Nokia\"   }   ],   \"id\":\"2\",   \"name\":\"Electronics\"  }  ] }"; 


    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[JSONString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; 

    NSError *mapError; 
    GlobalPreferences *globalPreferences = [[GlobalPreferences alloc] initWithDictionary:dictionary error:&mapError]; 
    if (mapError) { 
     NSLog(@"Something went wrong with mapping model %@", mapError); 
    } 

    NSLog(@"Your mapped model: %@", globalPreferences); 

Modeller:

Kinda GlobalPreference, kök modeli durumunda u ekstra bir şey

#import <JSONModel/JSONModel.h> 
    #import "Preference.h" 

    @interface GlobalPreferences : JSONModel 

    @property (nonatomic, strong) NSArray<Preference> *preferences; // using protocol here you specifying to which model data should be mapped 
    @property (nonatomic, strong) NSArray<Optional> *somethingElse; // some other settings may be here 

    @end 

    #import "GlobalPreferences.h" 

    @implementation GlobalPreferences 

    @end 

Tercih

#import <JSONModel/JSONModel.h> 
    #import "PreferenceItem.h" 

    @protocol Preference <NSObject> 

    @end 

    @interface Preference : JSONModel 

    @property (nonatomic, strong) NSNumber *ID; // required 
    @property (nonatomic, strong) NSString *name; // required 
    @property (nonatomic, strong) NSArray<PreferenceItem> *items; 

    @end 

    #import "Preference.h" 

    @implementation Preference 

    #pragma mark - JSONModel 

    + (JSONKeyMapper *)keyMapper { 
     return [[JSONKeyMapper alloc] initWithDictionary:@{ 
                  @"id": @"ID", 
                  }]; 
    } 

    @end 

PreferenceItem

eklemeye karar verirsek

coreData için tamamdır.Belki tüm bu harf için

gerekli değildir, ancak u/haritalama ağı yanıtı böyle es data types, missing keys, error handling ve benzeri ayrıştırılırken umurunda gereken şeylerin yeri vardır. Manuel olarak eşlerseniz - bir gün uygulama kırılmış olma riskiniz vardır.

+0

Detaylı cevabınız için teşekkür ederiz. "Öğeler" olmadan demek istediğniz: [ { "id": "3", "ad": "Nokia" } ], bu tür anahtarlar (örn: id), ayrıştırılması zor ? Arka uç adamım uzman olduklarını düşünüyor ve JSON formatını değiştirmek istemiyorlar. Yanıtlarını hala JSON Modeli ile kullanabilir miyim? Bunu onlara nasıl açıklarım? : D (yani, diğer uzmanların gerçekte ne yaptığını göstermek için herhangi bir güvenilir kaynak sorulmadı) – happycoder

+0

Sanırım, basitçe veritabanından alınan değerler bir koleksiyonun (sözlük vb.) Anahtarları olmayacaktır, aksi takdirde size modelinizi nasıl çizersiniz? Bu anahtarlar tarafından json'u ayrıştırmak için özellikler oluşturmanız gerekir, değil mi? Değerleri bilmiyorsunuz, bunun yerine veritabanı alanlarını biliyorsunuz (kimlik, adınız böyle) – Injectios

+0

Eğer onların JSON'unu kullanırsanız, özel modelinize sahip olamazsınız, sadece NSDictionary'ı bir model nesne olarak kullanmak zorundasınız. Kolay, hemen hemen aynı yaptığınız gibi. Veya model.id = dictionary.key vb. Gibi manuel olarak eşleştirmeniz gerekir. Bu API yapmanın uygun bir yolu olmadığını tahmin ediyorum, bunu kontrol edin http://stackoverflow.com/questions/12806386/standard-json-api-response-format – Injectios

0

Sana Objective-C için en iyi uygulamaları istendi biliyorum ama Swift geçiş ve SwiftyJSON kullanarak öneririm. Swift ile kod, Objective-C'den çok daha okunabilir.

let parameters: [String : AnyObject] = [ 
    "preferences": [ 
    "id": "123", 
    "name": "John", 
    "children": [ 
     ["3": "Three"] 
    ] 
    ] 
] 

let urlReq = NSMutableURLRequest(url) 
urlReq.HTTPMethod = .POST 

let req = Alamofire.ParameterEncoding.JSON.encode(urlReq, parameters: parameters).0 
let request = Alamofire.request(req) 

https://github.com/Alamofire/Alamofire

+0

Cevabınız için teşekkür ederiz, ama şu anda en iyisi yaklaşım alabilirim? – happycoder