2014-10-24 3 views
1

라이브 Bitcoin 가격을 표시하는 앱을 개발 중입니다. 저는 이것을하기 위해 2 개의 API를 사용합니다 - 하나의 일반 텍스트와 하나의 JSON. JSON API에 약간의 문제가 있습니다.JSON Swift 구문 분석

가 여기에 위의 코드에서 내 스위프트 코드

func BTCFallback(){ 

    var string2 = currencySelector.currentTitle 


    var url = NSURL(string:"https://bitpay.com/api/rates/" + (string2)!) 
    var request = NSURLRequest(URL: url) 


    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:fallback) 

    var data = NSData(contentsOfURL:url); 
    let value = NSString(string: USD.text).doubleValue/NSString(data:data, encoding:NSUTF8StringEncoding).doubleValue 

    // Define JSON string 
    var JSONString = "\(data)" 

    // Get NSData using string 
    if let JSONData = JSONString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { 

     // Parse JSONData into JSON object 
     var parsingError: NSError? 
    if let JSONObject = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &parsingError) as? [String: AnyObject] { 

     // If the parsing was successful grab the rate object 
     var rateObject: AnyObject? = JSONObject["rate"] 

     // Make sure the rate object is the expected type 
     if let rate = rateObject as? Float { 
      println("rate is \(rate)") 
      BTC.text = "\(rate)" 
     } 
    } else { 

     // There was an error parsing the JSON data 
     println("Error parsing JSON: \(parsingError)") 
     BTC.text = "err1" 
    } 

} 






} 

약간의, currencySelector.currentTitle는 인스턴스 USD를 들어, ISO 통화 코드와 동일합니다. BTC.text는 UI 요소입니다.

예상되는 동작은 코드에서 "rate"의 해당 부분을 BTC.text의 텍스트로 설정한다는 것입니다. 이 방법이 도움이 될 경우 API는 { "code": "USD", "name": "US Dollar", "rate": 376.71}과 같은 것을 반환합니다. 나는 무슨 일이 일어나고있는 것 376.71 여기

에 BTC.text 세트를 가지고, 위의 예를 사용하여, 원하는 것이 다음 consoe 오류 내가 잘못 뭐하는 거지 Error parsing JSON: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x16eb0f60 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})

을 준다? 미리 감사드립니다!

+0

는 데이터가 파서로 전달되기 전에 어떤 모습 않습니다 : 예 목적을 위해 나는 단순한 동기 웹 전화 :

var url: NSURL! = NSURL(string:"https://bitpay.com/api/rates/AUD") var request = NSURLRequest(URL: url) var response: NSURLResponse? var error: NSError? var data: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error) println("data: \(data)") if let data: NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error) { println("data: \(data)") var parsingError: NSError? if let rateDictionary = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parsingError) as NSDictionary? { println("rateDictionary: \(rateDictionary)") // If the parsing was successful grab the rate object if var rateString: AnyObject = rateDictionary["rate"] { println("rateString: \(rateString)") // Make sure the rate object is the expected type if let rate = rateString.floatValue { println("rate is \(rate)") } } } } 

OUPUT를 사용? – Hyperbole

+0

1. 데이터를 문자열로 변환 한 다음 'JSONObjectWithData'이전의 데이터로 다시 변환하는 이유는 무엇입니까? 2. JSON 문자열'JSONString'을 println하고 JSON을 검사하여 유효한 JSON인지 확인하십시오. – zaph

+0

@Hyperbole JSON은 API에서 { "code": "USD", "name": "US Dollar", "rate": 376.71}처럼 보입니다. API에 대한 링크는 https://bitpay.com/api/rates/USD – rocket101

답변

3

반환 된 데이터와 비 직렬화를 처리하는 것은 모두 문제입니다.

여기에 예제 코드가 있습니다. Optionals의 처리가 개선되어야한다는 점에 유의하십시오. 이는 기본 코드를 보여주기위한 것입니다.

 
data: Optional(7b22636f 6465223a 22415544 222c226e 616d6522 3a224175 73747261 6c69616e 20446f6c 6c617222 2c227261 7465223a 3430372e 39393137 7d) 

rateDictionary: { 
    code = AUD; 
    name = "Australian Dollar"; 
    rate = "407.9917"; 
} 

rateString: 407.9917 

rate is 407.992