2017-11-09 20 views
-7

私の貧弱なスキルを迅速に把握するには、これを思いつくことができます。あなたが私のように素早く新しいことがあれば、それを使用して自由に感じてください。 downvotesありがとう。スウィフト4:JSONを解析する適切な方法

var jsonString = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=Hi&lang=ar" 
     // [error 2:11] no viable alternative at input 'jsonString =' 
     var components = NSURLComponents(string: jsonString) 
     var url = components?.url 
     var data = NSData(contentsOf: url!) 
     var error = NSError.self 
     var dictionary = try JSONSerialization.jsonObject(with: data! as Data, options: .allowFragments) as! NSDictionary 
     let dict1 = dictionary["text"] as! NSArray 
     let ps = Array(dict1.map{ $0 }) 

     print(ps[0]) 

が異なる言語に単語を翻訳するアイデアを思い付いた実践と練習..質問は私が迅速に新しいです、で、私のFAV言語は過去1.5 Obj-cました私はいつもこのコードを使用していましたが、それは完璧に機能しましたが、今日はクリーンな速さについてのメディア記事を見ました。試してみるのが大好きで、基本的に私は目を覚ましました。お問い合わせ

私のObj-cコードは

NSString *jsonString = [NSString stringWithFormat:@"https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=%@&lang=ar",self.textField2.text]; 
jsonString = [jsonString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 
NSURLComponents *components = [NSURLComponents componentsWithString:jsonString]; 
NSURL *url = components.URL; 
NSData *data=[NSData dataWithContentsOfURL:url]; 
NSError *error=nil; 
NSDictionary* dictionary = [NSJSONSerialization JSONObjectWithData:data 
                  options:kNilOptions 
                  error:&error]; 
if (error == nil) { 
    NSArray *result = dictionary[@"text"]; 
    if (result.count > 0) { 
     NSString *translattedSTR = result[0]; 
     self.txtview.text = translattedSTR; 
    } 
} 

iは残念ながら

var jsonString = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=\("Hello")&lang=ar" 
jsonString = jsonString.replacingOccurrences(of: " ", with: "%20") 
var components = URLComponents(string: jsonString) 
var url: URL? = components?.url 
var data = Data (contentsOf: url!) 
var error: Error? = nil 
var dictionary = (try? JSONSerialization.jsonObject(with: data ?? Data(), options: kNilOptions)) as? [AnyHashable: Any] 
if error == nil { 
    var result = dictionary["text"] as? [Any] 
    if result?.count > 0 { 
     var translattedSTR = result[0] as? String 
     print(translattedSTR) 
     // txtview.text = translattedSTR 
    } 
} 

を試みたが、迅速なコードです。私は投げることができます

コールを取得していますが、

PS

Dataに 'してみてください' でマークされていない:thisであるように、JSONは何かを探します!

+0

「動作しません」と定義します。どのようにして正確には機能しませんか? – rmaddy

+0

こんにちは@rmaddy、それはnilを返し、クラッシュする –

+0

Swift 4を使用しているなら、新しい 'Codable'と' JSONDecoder' APIを使うことを強くお勧めします。 – Hamish

答えて

0

あなたがすることができます確かに「ポート」スウィフトにこのロジック... ここでは私の超高速ポートです:

enum MyErrors: Error { 
    case urlParsingError(String) 
    case nonDictonaryObjectReturned(Any) 
} 

func fetchJson(textField text: String) throws -> String? { 
    do { 
     let jsonString = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=\(text)&lang=ar" 

     guard let url = URL(string: jsonString) else { 
      throw MyErrors.urlParsingError(jsonString) 
     } 
     // Consider using AlamoFire or your favorite 
     let data = try Data(contentsOf: url, options: Data.ReadingOptions()) 

     let jsonObject = try JSONSerialization.jsonObject(with: data,options: .allowFragments) 
     guard let dictionary = jsonObject as? [AnyHashable: Any] else { 
      throw MyErrors.nonDictonaryObjectReturned(jsonObject) 
     } 
     let result = dictionary["text"] as? [Any] 
     let translattedSTR = result?.first as? String 
     return translattedSTR 
    } catch { 
     print("caught error \(error)") 
     throw error 
    } 
} 

はしかし、本当の問題は、あなたがそのJSONでやりたいです...

Swift 4は、JSONエンコーディングおよびデコードロジックの「コンパイラ生成」を追加する新しいコーディング可能な機能を導入しました。したがって、JSON解析の 'ターゲット'の宛先がSwiftクラスまたは構造体に変換される場合、Encodable/Decodableはあなたの友人です。

https://medium.com/@ashishkakkad8/use-of-codable-with-jsonencoder-and-jsondecoder-in-swift-4-71c3637a6c65

あなたは、関連スウィフトの構造体やクラスのセットにマッピングする「埋め込まれた」JSON文書を、持っている場合、これは非常に便利です。

「Generic」JSON(予想される戻り結果が事前に分かっていない可能性があります...)を受け入れるロジックが必要な場合は、SwiftyJSONと考えることができます。 JSONSerialization.jsonObjectの周りに「素早い構文的な砂糖」を提供しますが、一般的にはCodeableを使用するほどパフォーマンスが悪いですが、型の安全性を望まないときは便利です。

Data(contentsOf:options:)の代わりにAlamoFireのような素晴らしいREST APIラッパーを使用することを検討してください。 Codeableのような拡張子があります。CodableAlamofireは、このURLを参照してこの素敵なSwift構造体/クラスを返すようにしています。しかし、それはまた「失敗」し、失敗がどこで起こったか(ネットワーク接続、HTTP、セキュリティ、JSON解析など)についての洞察を与えます。

+0

ありがとうございます。人生節約 –

関連する問題