0001 http://www.apache.org/licenses/LICENSE-2.0http://opensource.org/licenses/MIT
0015 extension JSON {
0016 Parameter Parameter Returns public static func encodeAsString(json: JSON, pretty: Swift.Bool = false) -> Swift.String {
0021 var s = ""
0022 encode(json, toStream: &s, pretty: pretty)
0023 return s
0024 }
0025
0026 Parameter Parameter Parameter public static func encode| Encoder.swift:22 | encode(json, toStream: &s, pretty: pretty) |
| ObjectiveC.swift:46 | JSON.encode(json, toStream: &output, pretty: pretty) |
<Target: OutputStreamType>(json: JSON, inout toStream stream: Target, pretty: Swift.Bool = false) {
0031 encode(json, toStream: &stream, indent: pretty ? 0 : nil)
0032 }
0033
0034 private static func encode| Encoder.swift:31 | encode(json, toStream: &stream, indent: pretty ? 0 : nil) |
| Encoder.swift:120 | encode(value, toStream: &stream, indent: indented) |
| Encoder.swift:147 | encode(elt, toStream: &stream, indent: indented) |
<Target: OutputStreamType>(json: JSON, inout toStream stream: Target, indent: Int?) {
0035 switch json {
0036 case .Null: encodeNull(&stream)
0037 case .Bool(let b): encodeBool(b, toStream: &stream)
0038 case .Int64(let i): encodeInt64(i, toStream: &stream)
0039 case .Double(let d): encodeDouble(d, toStream: &stream)
0040 case .String(let s): encodeString(s, toStream: &stream)
0041 case .Object(let obj): encodeObject(obj, toStream: &stream, indent: indent)
0042 case .Array(let ary): encodeArray(ary, toStream: &stream, indent: indent)
0043 }
0044 }
0045
0046 private static func encodeNull| Encoder.swift:36 | case .Null: encodeNull(&stream) |
<Target: OutputStreamType>(inout stream: Target) {
0047 stream.write("null")
0048 }
0049
0050 private static func encodeBool| Encoder.swift:37 | case .Bool(let b): encodeBool(b, toStream: &stream) |
<Target: OutputStreamType>(value: Swift.Bool, inout toStream stream: Target) {
0051 stream.write(value ? "true" : "false")
0052 }
0053
0054 private static func encodeInt64| Encoder.swift:38 | case .Int64(let i): encodeInt64(i, toStream: &stream) |
<Target: OutputStreamType>(value: Swift.Int64, inout toStream stream: Target) {
0055 stream.write(Swift.String(value))
0056 }
0057
0058 private static func encodeDouble| Encoder.swift:39 | case .Double(let d): encodeDouble(d, toStream: &stream) |
<Target: OutputStreamType>(value: Swift.Double, inout toStream stream: Target) {
0059 stream.write(Swift.String(value))
0060 }
0061
0062 private static func encodeString| Encoder.swift:40 | case .String(let s): encodeString(s, toStream: &stream) |
| Encoder.swift:118 | encodeString(key, toStream: &stream) |
<Target: OutputStreamType>(value: Swift.String, inout toStream stream: Target) {
0063 stream.write("\"")
0064 let scalars = value.unicodeScalars
0065 var start = scalars.startIndex
0066 let end = scalars.endIndex
0067 var idx = start
0068 while idx < scalars.endIndex {
0069 let s: Swift.String
0070 let c = scalars[idx]
0071 switch c {
0072 case "\\": s = "\\\\"
0073 case "\"": s = "\\\""
0074 case "\n": s = "\\n"
0075 case "\r": s = "\\r"
0076 case "\t": s = "\\t"
0077 case "\u{8}": s = "\\b"
0078 case "\u{C}": s = "\\f"
0079 case "\0"..<"\u{10}":
0080 s = "\\u000\(Swift.String(c.value, radix: 16, uppercase: true))"
0081 case "\u{10}"..<" ":
0082 s = "\\u00\(Swift.String(c.value, radix: 16, uppercase: true))"
0083 default:
0084 idx = idx.successor()
0085 continue
0086 }
0087 if idx != start {
0088 stream.write(Swift.String(scalars[start..<idx]))
0089 }
0090 stream.write(s)
0091 idx = idx.successor()
0092 start = idx
0093 }
0094 if start != end {
0095 Swift.String(scalars[start..<end]).writeTo(&stream)
0096 }
0097 stream.write("\"")
0098 }
0099
0100 private static func encodeObject| Encoder.swift:41 | case .Object(let obj): encodeObject(obj, toStream: &stream, indent: indent) |
<Target: OutputStreamType>(object: JSONObject, inout toStream stream: Target, indent: Int?) {
0101 let indented = indent.map({$0+1})
0102 if let indent = indented {
0103 stream.write("{\n")
0104 writeIndent(indent, toStream: &stream)
0105 } else {
0106 stream.write("{")
0107 }
0108 var first = true
0109 for (key, value) in object {
0110 if first {
0111 first = false
0112 } else if let indent = indented {
0113 stream.write(",\n")
0114 writeIndent(indent, toStream: &stream)
0115 } else {
0116 stream.write(",")
0117 }
0118 encodeString(key, toStream: &stream)
0119 stream.write(indented != nil ? ": " : ":")
0120 encode(value, toStream: &stream, indent: indented)
0121 }
0122 if let indent = indent {
0123 stream.write("\n")
0124 writeIndent(indent, toStream: &stream)
0125 }
0126 stream.write("}")
0127 }
0128
0129 private static func encodeArray| Encoder.swift:42 | case .Array(let ary): encodeArray(ary, toStream: &stream, indent: indent) |
<Target: OutputStreamType>(array: JSONArray, inout toStream stream: Target, indent: Int?) {
0130 let indented = indent.map({$0+1})
0131 if let indent = indented {
0132 stream.write("[\n")
0133 writeIndent(indent, toStream: &stream)
0134 } else {
0135 stream.write("[")
0136 }
0137 var first = true
0138 for elt in array {
0139 if first {
0140 first = false
0141 } else if let indent = indented {
0142 stream.write(",\n")
0143 writeIndent(indent, toStream: &stream)
0144 } else {
0145 stream.write(",")
0146 }
0147 encode(elt, toStream: &stream, indent: indented)
0148 }
0149 if let indent = indent {
0150 stream.write("\n")
0151 writeIndent(indent, toStream: &stream)
0152 }
0153 stream.write("]")
0154 }
0155
0156 private static func writeIndent| Encoder.swift:104 | writeIndent(indent, toStream: &stream) |
| Encoder.swift:114 | writeIndent(indent, toStream: &stream) |
| Encoder.swift:124 | writeIndent(indent, toStream: &stream) |
| Encoder.swift:133 | writeIndent(indent, toStream: &stream) |
| Encoder.swift:143 | writeIndent(indent, toStream: &stream) |
| Encoder.swift:151 | writeIndent(indent, toStream: &stream) |
<Target: OutputStreamType>(indent: Int, inout toStream stream: Target) {
0157 for _ in 4.stride(through: indent, by: 4) {
0158 stream.write(" ")
0159 }
0160 switch indent % 4 {
0161 case 1: stream.write(" ")
0162 case 2: stream.write(" ")
0163 case 3: stream.write(" ")
0164 default: break
0165 }
0166 }
0167 }
0168