【问题标题】:Objective-C - How to convert NSString to escaped JSON string?Objective-C - 如何将 NSString 转换为转义的 JSON 字符串?
【发布时间】:2013-03-28 10:30:15
【问题描述】:

我有一个可能包含引号、\、/、\r、\n 的 NSString,我想将它转换为 JSON 编码的字符串,所以像这样的字符串

“文本1\文本2”

变成

\"text1\\text2\"

是否有现有的功能可以让我这样做?

另外,我在我的项目中使用 SBJson,但我找不到 SBJson 是否可以这样做。

NSJSONSerialization 不在讨论范围内,因为我的应用程序仍需要支持 OSX 10.6

【问题讨论】:

    标签: objective-c escaping sbjson


    【解决方案1】:

    这能回答你的问题吗?

    -(NSString *)JSONString:(NSString *)aString {
        NSMutableString *s = [NSMutableString stringWithString:aString];
        [s replaceOccurrencesOfString:@"\\" withString:@"\\\\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
        [s replaceOccurrencesOfString:@"\"" withString:@"\\\"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
        [s replaceOccurrencesOfString:@"/" withString:@"\\/" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
        [s replaceOccurrencesOfString:@"\n" withString:@"\\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
        [s replaceOccurrencesOfString:@"\b" withString:@"\\b" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
        [s replaceOccurrencesOfString:@"\f" withString:@"\\f" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
        [s replaceOccurrencesOfString:@"\r" withString:@"\\r" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
        [s replaceOccurrencesOfString:@"\t" withString:@"\\t" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
        return [NSString stringWithString:s];
    }
    

    来源:converting NSString to JSON string

    【讨论】:

    • 几行代码转义不可打印字符怎么样? \U1234
    • 快速跟进:是否也需要处理单个“\”?它在图表中,但不在代码中。
    • 好吧,显示的代码只处理"/bfnrtu。 ` \ ` 和u[4 hex digits] 被排除在外。我一直使用上面的代码没有任何问题。我想\u1234 和 ` \ ` 处理正确。如果您在上面的代码中遇到任何问题,请告诉我。
    • @lakeskysea 是的,现有的sn-p并不全面。您需要添加 [s replaceOccurrencesOfString:@"\\" withString:@"\\\\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])]; 之类的内容才能正确处理反斜杠字符。
    • @DanielS。感谢您的解决方案,它解决了我的问题。
    【解决方案2】:

    Swift 4 解决方案

    extension String {
        var stringEncodedJSON: String {
            var copy = self
            let encodingDict: [String: String] = ["\"": "\\\"", "/": "\\/", "\n": "\\n", "\u{8}": "\\b","\u{12}": "\\f", "\r": "\\r", "\t": "\\t"]
            encodingDict.forEach({ copy = copy.replacingOccurrences(of: $0, with: $1) })
            return copy
        }
    }
    

    【讨论】:

      【解决方案3】:

      斯威夫特 2:

      /// Escape reserved characters to produce a valid JSON String
      /// For example double quotes `"` are replaced by `\"`
      /// - parameters:
      ///   - String: an unescaped string
      /// - returns: valid escaped JSON string
      func JSONString(str: String?) -> String? {
          var result : String? = nil
          if let str = str {
              result = str
                  .stringByReplacingOccurrencesOfString("\"", withString: "\\\"", options: .CaseInsensitiveSearch)
                  .stringByReplacingOccurrencesOfString("/", withString: "\\/", options: .CaseInsensitiveSearch)
                  .stringByReplacingOccurrencesOfString("\n", withString: "\\n", options: .CaseInsensitiveSearch)
                  .stringByReplacingOccurrencesOfString("\u{8}", withString: "\\b", options: .CaseInsensitiveSearch)
                  .stringByReplacingOccurrencesOfString("\u{12}", withString: "\\f", options: .CaseInsensitiveSearch)
                  .stringByReplacingOccurrencesOfString("\r", withString: "\\r", options: .CaseInsensitiveSearch)
                  .stringByReplacingOccurrencesOfString("\t", withString: "\\t", options: .CaseInsensitiveSearch)
          }
          return result
      }
      

      斯威夫特 3:

      func JSONString(str: String) -> String {
          var result = str
          result = result.replacingOccurrences(of: "\"", with: "\\\"")
              .replacingOccurrences(of: "/", with: "\\/")
              .replacingOccurrences(of: "\n", with: "\\n")
              .replacingOccurrences(of: "\u{8}", with: "\\b")
              .replacingOccurrences(of: "\u{12}", with: "\\f")
              .replacingOccurrences(of: "\r", with: "\\r")
              .replacingOccurrences(of: "\t", with: "\\t")
      
          return result
      }
      

      对防止错误非常有用:Domain=NSCocoaErrorDomain Code=3840 "Invalid escape sequence around character 123."

      【讨论】:

      • 不应该将\n 替换为\\n
      【解决方案4】:

      让我们以更原生的 JSON 方式来做吧 ;)

      如果你喜欢我的回答,请在https://github.com/wanjochan加注星标

      //trick: id(@[s]) => string => trim [] => target
      //NSString *s
      s=[[NSString alloc] initWithData:
        [NSJSONSerialization dataWithJSONObject:@[s] options:0 error:nil]
        encoding:NSUTF8StringEncoding];
      s=[[s substringToIndex:([s length]-1)] substringFromIndex:1];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-25
        • 2011-06-04
        • 1970-01-01
        • 2012-10-06
        • 2011-12-04
        • 1970-01-01
        • 2012-05-13
        相关资源
        最近更新 更多