2016-07-01 3 views
0

У меня есть карта для сохранения записей json. Вот предварительный просмотр моего кода.Как предотвратить экранирование определенных символов в строках, создаваемых кодером JSON?

mp := map[string]string{"key": "The Knight & Day"} 
fmt.Println(mp) 
bty3, err := json.Marshal(mp) 
fmt.Println(bty3, err) 
fmt.Println(string(bty3)) 

Выход following-

map[key:The Knight & Day] 
[123 34 107 101 121 34 58 34 84 104 101 32 75 110 105 103 104 116 32 92 117 48 48 50 54 32 68 97 121 34 125] <nil> 
{"key":"The Knight \u0026 Day"} 

Что я могу сделать для того, чтобы сохранить специальные символы?

+3

Это сохраняется, просто сбежал, чтобы избежать проблем с различными клиентами. Это справедливо для JSON. – JimB

+0

Я пытаюсь получить из него значение hmac и отправить его по сети. Другая сторона выбрасывает исключение, которое hmac не соответствует телу. – theGamblerRises

+0

Каждой стороне необходимо проверить hmac отправленные данные, а не некодированные данные, именно из-за изоморфных изменений, подобных этому, не говоря уже о возможных проблемах безопасности. Однако, если удаленная сторона не делает это правильно, вам просто нужно будет найти и заменить экранированные строки. – JimB

ответ

3

encoding/json docs показаны символы, которые экранированы по умолчанию: <, > и &.

Вы можете использовать strconv.Unquote как в этом ответе: How to convert escape characters in HTML tags?

Что-то простое, как это будет работать также:

bty3 = bytes.Replace(bty3, []byte(`\u003c`), []byte("<"), -1) 
bty3 = bytes.Replace(bty3, []byte(`\u003e`), []byte(">"), -1) 
bty3 = bytes.Replace(bty3, []byte(`\u0026`), []byte("&"), -1) 

В предстоящем выпуске Go1.7, вы можете отключить спасаясь в json.Encoder с SetEscapeHTML(false).

mp := map[string]string{"key": "The Knight & Day"} 
var buf bytes.Buffer 

enc := json.NewEncoder(&buf) 
enc.SetEscapeHTML(false) 
enc.Encode(mp) 

fmt.Println(&buf) 

который печатает

{"key":"The Knight & Day"} 
+1

Я бы предпочел использовать ['strconv.Unquote()'] (https://golang.org/pkg/strconv/#Unquote), например [this] (https://play.golang.org/p/oNqqdb1kDB) , См. [Этот ответ] (http://stackoverflow.com/a/36529158/720999) для получения дополнительной информации. – kostix

+0

@ kostix: спасибо, я новый, я забыл о другом методе для этого. – JimB

 Смежные вопросы

  • Нет связанных вопросов^_^