()
| 92 | } |
| 93 | |
| 94 | func (dec *Decoder) parseEscapedString() error { |
| 95 | if dec.cursor >= dec.length && !dec.read() { |
| 96 | return dec.raiseInvalidJSONErr(dec.cursor) |
| 97 | } |
| 98 | switch dec.data[dec.cursor] { |
| 99 | case '"': |
| 100 | dec.data[dec.cursor] = '"' |
| 101 | case '\\': |
| 102 | dec.data[dec.cursor] = '\\' |
| 103 | case '/': |
| 104 | dec.data[dec.cursor] = '/' |
| 105 | case 'b': |
| 106 | dec.data[dec.cursor] = '\b' |
| 107 | case 'f': |
| 108 | dec.data[dec.cursor] = '\f' |
| 109 | case 'n': |
| 110 | dec.data[dec.cursor] = '\n' |
| 111 | case 'r': |
| 112 | dec.data[dec.cursor] = '\r' |
| 113 | case 't': |
| 114 | dec.data[dec.cursor] = '\t' |
| 115 | case 'u': |
| 116 | start := dec.cursor |
| 117 | dec.cursor++ |
| 118 | str, err := dec.parseUnicode() |
| 119 | if err != nil { |
| 120 | return err |
| 121 | } |
| 122 | diff := dec.cursor - start |
| 123 | dec.data = append(append(dec.data[:start-1], str...), dec.data[dec.cursor:]...) |
| 124 | dec.length = len(dec.data) |
| 125 | dec.cursor += len(str) - diff - 1 |
| 126 | |
| 127 | return nil |
| 128 | default: |
| 129 | return dec.raiseInvalidJSONErr(dec.cursor) |
| 130 | } |
| 131 | |
| 132 | dec.data = append(dec.data[:dec.cursor-1], dec.data[dec.cursor:]...) |
| 133 | dec.length-- |
| 134 | |
| 135 | // Since we've lost a character, our dec.cursor offset is now |
| 136 | // 1 past the escaped character which is precisely where we |
| 137 | // want it. |
| 138 | |
| 139 | return nil |
| 140 | } |
| 141 | |
| 142 | func (dec *Decoder) getString() (int, int, error) { |
| 143 | // extract key |
no test coverage detected