From b68a011f55e613d54771cadd617f31a2492e7602 Mon Sep 17 00:00:00 2001 From: Liangliang He Date: Wed, 10 Dec 2014 22:35:33 +0800 Subject: [PATCH 1/2] Fix THRIFT-2884 - Map does not serialize correctly for JSON protocol in Go library --- lib/go/thrift/json_protocol.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/go/thrift/json_protocol.go b/lib/go/thrift/json_protocol.go index 78348ec827c..bd89cb0519c 100644 --- a/lib/go/thrift/json_protocol.go +++ b/lib/go/thrift/json_protocol.go @@ -134,10 +134,16 @@ func (p *TJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) if e := p.WriteString(s); e != nil { return e } - return p.WriteI64(int64(size)) + if e := p.WriteI64(int64(size)); e != nil { + return e + } + return p.OutputObjectBegin() } func (p *TJSONProtocol) WriteMapEnd() error { + if e := p.OutputObjectEnd(); e != nil { + return e + } return p.OutputListEnd() } From d70a91d209bd469d1528e9f98340355097c2198f Mon Sep 17 00:00:00 2001 From: Liangliang He Date: Wed, 10 Dec 2014 22:59:05 +0800 Subject: [PATCH 2/2] Fix THRIFT-2779 - PHP TJSONProtocol encode unicode into UCS-4LE which can't be parsed by other langurage bindings --- lib/php/lib/Thrift/Protocol/TJSONProtocol.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/php/lib/Thrift/Protocol/TJSONProtocol.php b/lib/php/lib/Thrift/Protocol/TJSONProtocol.php index 6c93b09b38e..dfa07d8c6a0 100644 --- a/lib/php/lib/Thrift/Protocol/TJSONProtocol.php +++ b/lib/php/lib/Thrift/Protocol/TJSONProtocol.php @@ -215,6 +215,15 @@ private function hexChar($val) return dechex($val); } + private function json_encode_utf8($str) { + $str = preg_replace_callback("/\\\\u([a-f0-9]{4})/", + function ($matches) { + return iconv('UCS-4LE','UTF-8', pack('V', hexdec('U' . $matches[1]))); + }, + json_encode($str)); + return preg_replace("|\\\\/|", "/", $str); + } + private function writeJSONString($b) { $this->context_->write(); @@ -223,7 +232,7 @@ private function writeJSONString($b) $this->trans_->write(self::QUOTE); } - $this->trans_->write(json_encode($b)); + $this->trans_->write($this->json_encode_utf8($b)); if (is_numeric($b) && $this->context_->escapeNum()) { $this->trans_->write(self::QUOTE);