@@ -217,7 +217,52 @@ should.Equal("1000001", string(output))
217
217
如果要自定义的话,参见 ` RegisterTimeAsInt64Codec ` 的实现代码
218
218
219
219
# 使用 MarshalText支持非字符串作为key的map
220
+
221
+ 虽然 JSON 标准里只支持 string 作为 key 的 map。但是 golang 通过 MarshalText() 接口,使得其他类型也可以作为 map 的 key。例如
222
+
223
+ ``` golang
224
+ f , _ , _ := big.ParseFloat (" 1" , 10 , 64 , big.ToZero )
225
+ val := map [*big.Float ]string {f: " 2" }
226
+ str , err := MarshalToString (val)
227
+ should.Equal (` {"1":"2"}` , str)
228
+ ```
229
+
230
+ 其中 ` big.Float ` 就实现了 MarshalText()
231
+
220
232
# 使用 json.RawMessage
233
+
234
+ 如果部分json文档没有标准格式,我们可以把原始的文本信息用string保存下来。
235
+
236
+ ``` golang
237
+ type TestObject struct {
238
+ Field1 string
239
+ Field2 json.RawMessage
240
+ }
241
+ var data TestObject
242
+ json.Unmarshal ([]byte (` {"field1": "hello", "field2": [1,2,3]}` ), &data)
243
+ should.Equal (` [1,2,3]` , string (data.Field2 ))
244
+ ```
245
+
221
246
# 使用 json.Number
247
+
248
+ 默认情况下,如果是 interface{} 对应数字的情况会是 float64 类型的。如果输入的数字比较大,这个表示会有损精度。所以可以 ` UseNumber() ` 启用 ` json.Number ` 来用字符串表示数字。
249
+
250
+ ``` golang
251
+ decoder1 := json.NewDecoder (bytes.NewBufferString (` 123` ))
252
+ decoder1.UseNumber ()
253
+ var obj1 interface {}
254
+ decoder1.Decode (&obj1)
255
+ should.Equal (json.Number (" 123" ), obj1)
256
+ ```
257
+
258
+ jsoniter 支持标准库的这个用法。同时,扩展了行为使得 Unmarshal 也可以支持 UseNumber 了。
259
+
260
+ ``` golang
261
+ json := Config {UseNumber:true }.Froze ()
262
+ var obj interface {}
263
+ json.UnmarshalFromString (" 123" , &obj)
264
+ should.Equal (json.Number (" 123" ), obj)
265
+ ```
266
+
222
267
# 统一更改字段的命名风格
223
268
# 使用私有的字段
0 commit comments