2017-11-01 16 views
-1

この文字列からリンクのみを抽出し、そのリンクで新しい文字列を作成しようとしていますが、これを行う最善の方法はわかりません。どのように私がこれを効果的に行うことができるかについて誰かが私に啓発できるなら、私はそれを高く評価します!任意の文字列の内部でURLを取得するためにSwiftのJSON中文字列から特定の値を取得4

文字列

{ 
    "timestamp": 1509507857555, 
    "profileId": "e58d7f751c7f498085a79a37bf22f20b", 
    "profileName": "Rhidlor", 
    "textures": { 
     "SKIN": { 
      "url": "http://textures.minecraft.net/texture/1137b867b4a2fb593cf6d05d8210937cc78bc9e0558ad63d41cc8ec2f99e7d63" 
     } 
    } 
} 

答えて

1

あなたの与えられた文字列がJSONです。与えられたJSONからURLを得ることができます:

struct Response: Decodable { 
    var textures: [String: Textures] 
} 
struct Textures: Decodable { 
    var url: String 
} 

let jsonStr = """ 
{"timestamp":1509507857555,"profileId":"e58d7f751c7f498085a79a37bf22f20b","profileName":"Rhidlor","textures":{"SKIN":{"url":"http://textures.minecraft.net/texture/1137b867b4a2fb593cf6d05d8210937cc78bc9e0558ad63d41cc8ec2f99e7d63"}}} 
""" 
let data = jsonStr.data(using: .utf8)! 
let decoder = JSONDecoder() 
do { 
    let jsonData = try decoder.decode(Response.self, from: data) 
    if let skin = jsonData.textures["SKIN"] { 
     print(skin.url) 
    } 
} 
catch { 
    print("error:\(error)") 
} 
+0

これは私が探していたものです、助けてくれてありがとう! –

-1

は、次の方法を使用することができます。

Swift4

let testString: String = "{\"timestamp\":1509507857555,\"profileId\":\"e58d7f751c7f498085a79a37bf22f20b\",\"profileName\":\"Rhidlor\",\"textures\":{\"SKIN\":{\"url\":\"http://textures.minecraft.net/texture/1137b867b4a2fb593cf6d05d8210937cc78bc9e0558ad63d41cc8ec2f99e7d63\"}}}" 
    let pat = "http?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?" 
    let regex = try! NSRegularExpression(pattern: pat, options: []) 
    let matches = regex.matches(in: testString, options: [], range: NSRange(location: 0, length: LGSemiModalNavViewController.characters.count)) 

    var matchedUrls = [String]() 

    for match in matches { 
     let url = (htmlSource as NSString).substring(with: match.range) 
     matchedUrls.append(url) 
    } 

    print(matchedUrls) 

のObjective - C

NSString *testString   = @"{\"timestamp\":1509507857555,\"profileId\":\"e58d7f751c7f498085a79a37bf22f20b\",\"profileName\":\"Rhidlor\",\"textures\":{\"SKIN\":{\"url\":\"http://textures.minecraft.net/texture/1137b867b4a2fb593cf6d05d8210937cc78bc9e0558ad63d41cc8ec2f99e7d63\"}}}"; 

    NSError    *error; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"http?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?" options:NSRegularExpressionCaseInsensitive error:&error]; 

    NSArray *arrayOfAllMatches = [regex matchesInString:testString options:0 range:NSMakeRange(0, [testString length])]; 

    NSMutableArray *arrayOfURLs = [NSMutableArray new]; 

    for (NSTextCheckingResult *match in arrayOfAllMatches) { 
     NSString *substringForMatch = [testString substringWithRange:match.range]; 
     NSLog(@"Extracted URL: %@", substringForMatch); 

     [arrayOfURLs addObject:substringForMatch]; 
    } 

    NSLog(@"%@",arrayOfURLs); 
+0

JSONオブジェクトではない文字列がある場合、これらの方法は良い解決策です。誰かがそれを好まなかった:)面白い。 – serdaryillar

+0

ええ、誰かがそれを嫌っていたことは残念です。私はあなたの答えをありがとう! :) –

関連する問題