代码之家  ›  专栏  ›  技术社区  ›  Prabhu

如何在调试器中预打印来自API调用的json响应?

  •  8
  • Prabhu  · 技术社区  · 7 年前

    在调试时,试图找出如何从API中预打印响应的json值:

    let session = URLSession(configuration: .default)
    let task = session.dataTask(with: urlRequest) { data, response, error in
        completion(data, response, error)
    }
    

    在调试器中,如果我执行po数据,我会得到如下结果:

    enter image description here

    如何打印数据对象中的实际json结构?希望看到这样的情况:

    {“firstName”:“John”, “lastName”:“Doe”, ... }

    po debugPrint(data) 在这种情况下不输出任何内容。

    4 回复  |  直到 7 年前
        1
  •  6
  •   Ilias Karim guru    4 年前
    e print(String(data: JSONSerialization.data(withJSONObject: JSONSerialization.jsonObject(with: data, options: []), options: .prettyPrinted), encoding: .utf8)!)
    
        2
  •  5
  •   Rashwan L    7 年前

    尝试 JSONSerialization ,大致如下:

    let url = URL(string: "http://date.jsontest.com")
    var request : URLRequest = URLRequest(url: url!)
    request.httpMethod = "GET"
    
    let dataTask = URLSession.shared.dataTask(with: request) {
        data,response,error in
        do {
            if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary {
                print(jsonResult)
            }
        } catch let error {
            print(error.localizedDescription)
        }
    }
    dataTask.resume()
    

    哪里 jsonResult 将打印以下内容:

    {
        date = "02-19-2018";
        "milliseconds_since_epoch" = 1519078643223;
        time = "10:17:23 PM";
    }
    
        3
  •  1
  •   Ilias Karim guru    4 年前
    // given raw JSON, return a usable Foundation object
    private func convertDataWithCompletionHandler(_ data: Data, completionHandlerForConvertData: (_ result: AnyObject?, _ error: NSError?) -> Void) {
        
        var parsedResult: AnyObject! = nil
        do {
            parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as AnyObject
        } catch {
            let userInfo = [NSLocalizedDescriptionKey : "Could not parse the data as JSON: '\(data)'"]
            completionHandlerForConvertData(nil, NSError(domain: "convertDataWithCompletionHandler", code: 1, userInfo: userInfo))
        }
        completionHandlerForConvertData(parsedResult, nil)
    }
    
        4
  •  -1
  •   Bomi Chen    3 年前

    这是objective-c代码。


    NSString+预打印。h类

    @interface NSString (PrettyPrint)
    
    + (NSString * _Nonnull)prettifiedJsonStringFromData:(nullable NSData *)data;
    + (NSString * _Nonnull)prettifiedStringFromDictionary:(nullable NSDictionary *)dictionary;
    
    @end
    

    NSString+预打印。m级

    #import "NSString+PrettyPrint.h"
    
    @implementation NSString (Prettified)
    
    - (NSString *)trimForCount:(NSUInteger)count {
        return self.length > count ? [self substringWithRange:NSMakeRange(0, count)] : self;
    }
    
    + (NSString *)prettifiedStringFromDictionary:(nullable NSDictionary *)dictionary {
        
        if (dictionary == nil) { return @"nil"; }
        
        NSMutableString *returnStr = [NSMutableString stringWithString:@"[ \n"];
        
        for (NSString *key in dictionary) {
            [returnStr appendFormat:@"  %@: %@,\n", key, [dictionary valueForKey:key]];
        }
        
        [returnStr appendFormat:@"]"];
        
        return returnStr;
    }
    
    + (NSString *)prettifiedJsonStringFromData:(nullable NSData *)data {
        
        if (data == nil) { return @"nil"; }
        
        
        NSData *jsonData;
        NSError *error = nil;
        
        NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
        id jsonObject;
        @try {
            jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
        } @catch(id anException) {
            return anException ? [NSString stringWithFormat:@"Json Parse Exception: %@", anException] : jsonStr ? jsonStr : @"json parse exception";
        }
        if (jsonObject == nil) {
            return jsonStr ? jsonStr : @"nil (json object from data)";
        } else {
            BOOL isValidJsonObject = [NSJSONSerialization isValidJSONObject:jsonObject];
            if (isValidJsonObject) {
                NSData *finalData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:&error];
                //TODO: error description
                NSString *prettyJson = [[NSString alloc] initWithData:finalData encoding:NSUTF8StringEncoding];
                return prettyJson;
            } else {
                return [NSString stringWithFormat:@"%@\n%@", jsonStr, @" (⚠️ Invalid json object ⚠️)\n"];
            }
        }
    }
    
    @end
    

    然后调用方法,

    示例1。打印正文、响应的NSData。。。等

    NSLog(@"body: %@", [NSString prettifiedJsonStringFromData:[request HTTPBody]]);
    

    ex2.打印NSDictionary

    NSLog(@"headers: %@", [NSString prettifiedStringFromDictionary:[request allHTTPHeaderFields]]);
    

    您可能会在日志中得到这些结果。

    enter image description here

    enter image description here

    编辑日志:

    在220112处编辑,防止异常