【问题标题】:Best way to display JSON (well formatted) in UITextView or UIWebView in iOS在 iOS 的 UITextView 或 UIWebView 中显示 JSON(格式正确)的最佳方式
【发布时间】:2015-06-28 13:23:53
【问题描述】:

我需要在我的 iPhone 应用程序中显示 JSON。目前我正在获取未格式化的 JSON - 就像一个没有缩进的大字符串。

什么是最好的展示方式?

谢谢,

【问题讨论】:

    标签: ios json


    【解决方案1】:

    获取格式化的 JSON 字符串。

    解决方案是从 JSON 字符串创建 JSON 对象,

    然后使用 .PrettyPrinted 选项将 JSON 对象转换回 JSON 字符串。

    代码是

    let jsonString = "[{\"person\": {\"name\":\"Dani\",\"age\":\"24\"}},{\"person\": {\"name\":\"ray\",\"age\":\"70\"}}]"
    
    var error: NSError?
    
    //1. convert string to NSData
    let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
    
    //2. convert JSON data to JSON object
    let jsonObject:AnyObject = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error)!
    
    //3. convert back to JSON data by setting .PrettyPrinted option
    let prettyJsonData = NSJSONSerialization.dataWithJSONObject(jsonObject, options: .PrettyPrinted, error: &error)!
    
    //4. convert NSData back to NSString (use NSString init for convenience), later you can convert to String.
    let prettyPrintedJson = NSString(data: prettyJsonData, encoding: NSUTF8StringEncoding)!
    
    //print the result
    println("\(prettyPrintedJson)")
    

    结果将如下所示

    【讨论】:

    • @nRewik 为什么是NSString 而不是String
    【解决方案2】:

    Objective-C 代码

    NSString *jsonString = @"[{\"person\": {\"name\":\"Dani\",\"age\":\"24\"}},{\"person\": {\"name\":\"ray\",\"age\":\"70\"}}]";
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:nil error:&error];
    NSData *prettyJsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:&error];
    NSString *prettyPrintedJson = [NSString stringWithUTF8String:[prettyJsonData bytes]];
    
    NSLog(@"%@", prettyPrintedJson);
    

    【讨论】:

      【解决方案3】:

      这是 Objective-C 代码。


      NSString+PrettyPrint.h

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

      NSString+PrettyPrint.m

      #import "NSString+PrettyPrint.h"
      
      @implementation NSString (PrettyPrint)
      
      + (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 = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
          if (jsonObject == nil) {
              return @"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
      

      然后在你需要使用方法时调用它们。

      ex1.为 body、response ...等打印 NSData

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

      ex2.打印 NSDictionary

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

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

      【讨论】:

        【解决方案4】:

        请记住,如果您正在处理 Encodable 对象,则可以使用 JSONEncoder 进行漂亮的打印。

        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted
                
        guard let jsonData = try? encoder.encode(obj) else {
            return
        }
                
        let text = String(decoding: jsonData, as: UTF8.self)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-04
          • 2021-01-21
          • 2010-11-22
          • 1970-01-01
          • 2013-02-02
          • 2020-11-24
          • 1970-01-01
          相关资源
          最近更新 更多