0

Twitter のストリーミング API からアプリケーションに送信される json をデコードしようとしています。

Twitter は、次の構造を持つクライアント データを送信します。

ストリーミング API 応答の本文は、改行で区切られた一連のメッセージで構成されます。ここで、「改行」は \r\n (16 進数で 0x0D 0x0A) と見なされ、「メッセージ」は JSON でエンコードされたデータ構造または空白行です。 .

基本的にツイートは \r\n で区切ります。1 つのツイートを送信することもあれば、一度に多数のツイートを送信することもあります。

「多く」のケースをデコードすることは、私にとって問題があります。iOS に組み込まれている NSJSONSerialization クラスを使用します。問題は、最初のツイートを読み取り、\r\n を見て、これをゴミと見なし、空の配列と付随するエラーを返すことです。

この問題を回避するために、次のコードを使用して基本的に改行を削除します。

// json is the received json data
    NSString* responseString = [[NSString alloc] initWithData:json encoding:NSASCIIStringEncoding];

    NSMutableArray* responseMutableArray = [[responseString componentsSeparatedByString:@"\r\n"] mutableCopy];
    [responseMutableArray removeLastObject];

    NSArray* responseArray = [NSArray arrayWithArray:responseMutableArray];
    [responseMutableArray removeAllObjects];

    NSError* error;

    for(NSString* tweetString in responseArray)
    {
        NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:[tweetString dataUsingEncoding:NSUTF8StringEncoding] options: NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:&error];
        [responseMutableArray addObject:dict];
    }
 //responseMutableArray contains the parsed tweets

アプローチは、データを NSString に変換し、NSString を (\r\n で分割して) 配列に変換し、配列をデータに戻してから、JSON を解析して辞書にすることです。それは面倒なプロセスであり、これを行うことができるより効率的な方法があるかどうか疑問に思っています.

どうもありがとう

VB

4

3 に答える 3

0

これを試して:

NSString *string = [[NSString alloc] initWithData:json encoding:NSASCIIStringEncoding]:
string = [NSString stringWithFormat:@"[%@]", [string stringByReplacingOccurrencesOfString:@"\\r\\n" withString:@","]];
NSArray *array= [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:&error];
于 2013-03-17T09:12:25.577 に答える
0

これに触れてください:

let stringData = String(data: data, encoding: NSUTF8StringEncoding)
if let strData = stringData {
    let newString = strData.stringByReplacingOccurrencesOfString("\r\n", withString: "\\r\\n")
    if let newString = newString {
        do  {
            let dict:[AnyObject] = try NSJSONSerialization.JSONObjectWithData(newString.dataUsingEncoding(NSUTF8StringEncoding)!, options: [.AllowFragments, .MutableContainers]) as! [AnyObject]
        }catch let e as NSError {
            print(e.description)
        }  
    } 
}
于 2016-08-31T11:44:43.823 に答える