2016-01-14 3 views
0

мне нужно разобрать JSON строку, как этотКак разобрать JSON в Swift 2.1?

{ 
    "someData": [{ 
     "title": "Test!", 
     "content": "hello!" 
    }, { 
     "title": "Test 2!", 
     "content": "hello!" 
    }], 
    "otherData": [{ 
     "title": "Hey", 
     "content": "yes or no" 
    }] 
} 

У меня есть некоторый код для разбора JSON. Но этот код просто анализирует json, который находится только в одном массиве. Я играл с кодом, поэтому могу разбирать массив, который находится в массиве с текстом в нем (я имею в виду этот json сверху).

Теперь я сдаюсь ... Что я должен сделать, это может сработать?

let jsonString = NSString(data: getJSON("URL"), encoding: NSUTF8StringEncoding) 
    let jsonData = jsonString!.dataUsingEncoding(NSUTF8StringEncoding)! 
    do { 
     if let parsed = (try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions(rawValue: 0)) as? [[String : AnyObject]]) { 
      for items in parsed { 
       if let item = items as? [String : AnyObject] { 
        let title = item["title"] as? String 
        doSomething(title!) 
       } 
      } 
     } 
    } catch let error as NSError { 
     print("\(error)") 
    } 
+2

Вы должны использовать форму SwiftyJSON здесь: https://github.com/lingoer/SwiftyJSON – Korpel

ответ

1
func parseJSON() { 
    let path = NSBundle.mainBundle().pathForResource("data1", ofType: "json") 
    let jsonData = NSData(contentsOfFile: path!)! as NSData 
    do { 
     let newJson = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers) 

     if let otherData = newJson["otherData"] as? NSArray { 
      let newData1 = otherData[0] 
      if let content = newData1["content"] as? String { 
       if let title = newData1["title"] as? String { 
        print(title) 
        print(content) 
       } 

      } 
     } 

     if let someData = newJson["someData"] as? NSArray { 
      var x = 0 
      while x < someData.count { 
       if let title = someData[x]["title"] as? String { 
        if let content = someData[x]["content"] as? String { 
         print(title) 
         print(content) 
        } 
       } 
       x++ 
      } 

     } 


    } 
    catch { 

    } 

} 

затем, в вашем viewDidLoad:

override func viewDidLoad() { 
    parseJSON() 
} 

Edit:

Это при условии, что у вас есть файл с именем JSon "data1.json" и это в вашем проекте каталог, подобный так:

enter image description here

Если json-файл не имеет этого имени или находится в другом месте в каталоге проекта, это не сработает.

1

Чтение строки JSON довольно просто.

Есть только два типа коллекции:

  • словаря (или объект в терминах спецификации), представленный парой фигурных скобок {}
  • массива, представленной парой квадратных скобок []

Все ключи в JSON имеют тип String по определению, поэтому наименее специфический тип словаря - [String:AnyObject].


В вашем примере корневой объект представляет собой словарь {}, содержащий два ключа someData и otherData поэтому линию, чтобы создать объект JSON должен быть (не if - let)

let parsed = try NSJSONSerialization.JSONObjectWithData(jsonData, options:[]) as! [String:AnyObject] 

someData содержит массив словарей [{...},{...}], в вашем примере все значения являются строками, поэтому вы можете ограничить объект до [[String:String]] и разобрать элементы с помощью

if let someData = parsed["someData"] as? [[String:String]] { 
    for anItem in someData { 
    print(anItem["title"]!) 
    print(anItem["content"]!) 
    } 
} 

Для простых структур сторонняя библиотека, такая как SwiftyJSON, на самом деле не нужна.

+0

просто примечание ... «Ранние версии JSON (например, указанные в RFC 4627) требовали, чтобы действительный JSON-документ, должен состоять только из объекта или типа массива, хотя они могут содержать другие типы внутри них. Это ограничение было удалено, начиная с RFC 7158, так что документ JSON может состоять полностью из любого возможного типизированного значения JSON ». – user3441734