github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/bitly/go-simplejson/simplejson.go (about) 1 package simplejson 2 3 import ( 4 "encoding/json" 5 "errors" 6 "log" 7 ) 8 9 // returns the current implementation version 10 func Version() string { 11 return "0.5.0" 12 } 13 14 type Json struct { 15 data interface{} 16 } 17 18 // NewJson returns a pointer to a new `Json` object 19 // after unmarshaling `body` bytes 20 func NewJson(body []byte) (*Json, error) { 21 j := new(Json) 22 err := j.UnmarshalJSON(body) 23 if err != nil { 24 return nil, err 25 } 26 return j, nil 27 } 28 29 // New returns a pointer to a new, empty `Json` object 30 func New() *Json { 31 return &Json{ 32 data: make(map[string]interface{}), 33 } 34 } 35 36 // Interface returns the underlying data 37 func (j *Json) Interface() interface{} { 38 return j.data 39 } 40 41 // Encode returns its marshaled data as `[]byte` 42 func (j *Json) Encode() ([]byte, error) { 43 return j.MarshalJSON() 44 } 45 46 // EncodePretty returns its marshaled data as `[]byte` with indentation 47 func (j *Json) EncodePretty() ([]byte, error) { 48 return json.MarshalIndent(&j.data, "", " ") 49 } 50 51 // Implements the json.Marshaler interface. 52 func (j *Json) MarshalJSON() ([]byte, error) { 53 return json.Marshal(&j.data) 54 } 55 56 // Set modifies `Json` map by `key` and `value` 57 // Useful for changing single key/value in a `Json` object easily. 58 func (j *Json) Set(key string, val interface{}) { 59 m, err := j.Map() 60 if err != nil { 61 return 62 } 63 m[key] = val 64 } 65 66 // SetPath modifies `Json`, recursively checking/creating map keys for the supplied path, 67 // and then finally writing in the value 68 func (j *Json) SetPath(branch []string, val interface{}) { 69 if len(branch) == 0 { 70 j.data = val 71 return 72 } 73 74 // in order to insert our branch, we need map[string]interface{} 75 if _, ok := (j.data).(map[string]interface{}); !ok { 76 // have to replace with something suitable 77 j.data = make(map[string]interface{}) 78 } 79 curr := j.data.(map[string]interface{}) 80 81 for i := 0; i < len(branch)-1; i++ { 82 b := branch[i] 83 // key exists? 84 if _, ok := curr[b]; !ok { 85 n := make(map[string]interface{}) 86 curr[b] = n 87 curr = n 88 continue 89 } 90 91 // make sure the value is the right sort of thing 92 if _, ok := curr[b].(map[string]interface{}); !ok { 93 // have to replace with something suitable 94 n := make(map[string]interface{}) 95 curr[b] = n 96 } 97 98 curr = curr[b].(map[string]interface{}) 99 } 100 101 // add remaining k/v 102 curr[branch[len(branch)-1]] = val 103 } 104 105 // Del modifies `Json` map by deleting `key` if it is present. 106 func (j *Json) Del(key string) { 107 m, err := j.Map() 108 if err != nil { 109 return 110 } 111 delete(m, key) 112 } 113 114 // Get returns a pointer to a new `Json` object 115 // for `key` in its `map` representation 116 // 117 // useful for chaining operations (to traverse a nested JSON): 118 // js.Get("top_level").Get("dict").Get("value").Int() 119 func (j *Json) Get(key string) *Json { 120 m, err := j.Map() 121 if err == nil { 122 if val, ok := m[key]; ok { 123 return &Json{val} 124 } 125 } 126 return &Json{nil} 127 } 128 129 // GetPath searches for the item as specified by the branch 130 // without the need to deep dive using Get()'s. 131 // 132 // js.GetPath("top_level", "dict") 133 func (j *Json) GetPath(branch ...string) *Json { 134 jin := j 135 for _, p := range branch { 136 jin = jin.Get(p) 137 } 138 return jin 139 } 140 141 // GetIndex returns a pointer to a new `Json` object 142 // for `index` in its `array` representation 143 // 144 // this is the analog to Get when accessing elements of 145 // a json array instead of a json object: 146 // js.Get("top_level").Get("array").GetIndex(1).Get("key").Int() 147 func (j *Json) GetIndex(index int) *Json { 148 a, err := j.Array() 149 if err == nil { 150 if len(a) > index { 151 return &Json{a[index]} 152 } 153 } 154 return &Json{nil} 155 } 156 157 // CheckGet returns a pointer to a new `Json` object and 158 // a `bool` identifying success or failure 159 // 160 // useful for chained operations when success is important: 161 // if data, ok := js.Get("top_level").CheckGet("inner"); ok { 162 // log.Println(data) 163 // } 164 func (j *Json) CheckGet(key string) (*Json, bool) { 165 m, err := j.Map() 166 if err == nil { 167 if val, ok := m[key]; ok { 168 return &Json{val}, true 169 } 170 } 171 return nil, false 172 } 173 174 // Map type asserts to `map` 175 func (j *Json) Map() (map[string]interface{}, error) { 176 if m, ok := (j.data).(map[string]interface{}); ok { 177 return m, nil 178 } 179 return nil, errors.New("type assertion to map[string]interface{} failed") 180 } 181 182 // Array type asserts to an `array` 183 func (j *Json) Array() ([]interface{}, error) { 184 if a, ok := (j.data).([]interface{}); ok { 185 return a, nil 186 } 187 return nil, errors.New("type assertion to []interface{} failed") 188 } 189 190 // Bool type asserts to `bool` 191 func (j *Json) Bool() (bool, error) { 192 if s, ok := (j.data).(bool); ok { 193 return s, nil 194 } 195 return false, errors.New("type assertion to bool failed") 196 } 197 198 // String type asserts to `string` 199 func (j *Json) String() (string, error) { 200 if s, ok := (j.data).(string); ok { 201 return s, nil 202 } 203 return "", errors.New("type assertion to string failed") 204 } 205 206 // Bytes type asserts to `[]byte` 207 func (j *Json) Bytes() ([]byte, error) { 208 if s, ok := (j.data).(string); ok { 209 return []byte(s), nil 210 } 211 return nil, errors.New("type assertion to []byte failed") 212 } 213 214 // StringArray type asserts to an `array` of `string` 215 func (j *Json) StringArray() ([]string, error) { 216 arr, err := j.Array() 217 if err != nil { 218 return nil, err 219 } 220 retArr := make([]string, 0, len(arr)) 221 for _, a := range arr { 222 if a == nil { 223 retArr = append(retArr, "") 224 continue 225 } 226 s, ok := a.(string) 227 if !ok { 228 return nil, err 229 } 230 retArr = append(retArr, s) 231 } 232 return retArr, nil 233 } 234 235 // MustArray guarantees the return of a `[]interface{}` (with optional default) 236 // 237 // useful when you want to interate over array values in a succinct manner: 238 // for i, v := range js.Get("results").MustArray() { 239 // fmt.Println(i, v) 240 // } 241 func (j *Json) MustArray(args ...[]interface{}) []interface{} { 242 var def []interface{} 243 244 switch len(args) { 245 case 0: 246 case 1: 247 def = args[0] 248 default: 249 log.Panicf("MustArray() received too many arguments %d", len(args)) 250 } 251 252 a, err := j.Array() 253 if err == nil { 254 return a 255 } 256 257 return def 258 } 259 260 // MustMap guarantees the return of a `map[string]interface{}` (with optional default) 261 // 262 // useful when you want to interate over map values in a succinct manner: 263 // for k, v := range js.Get("dictionary").MustMap() { 264 // fmt.Println(k, v) 265 // } 266 func (j *Json) MustMap(args ...map[string]interface{}) map[string]interface{} { 267 var def map[string]interface{} 268 269 switch len(args) { 270 case 0: 271 case 1: 272 def = args[0] 273 default: 274 log.Panicf("MustMap() received too many arguments %d", len(args)) 275 } 276 277 a, err := j.Map() 278 if err == nil { 279 return a 280 } 281 282 return def 283 } 284 285 // MustString guarantees the return of a `string` (with optional default) 286 // 287 // useful when you explicitly want a `string` in a single value return context: 288 // myFunc(js.Get("param1").MustString(), js.Get("optional_param").MustString("my_default")) 289 func (j *Json) MustString(args ...string) string { 290 var def string 291 292 switch len(args) { 293 case 0: 294 case 1: 295 def = args[0] 296 default: 297 log.Panicf("MustString() received too many arguments %d", len(args)) 298 } 299 300 s, err := j.String() 301 if err == nil { 302 return s 303 } 304 305 return def 306 } 307 308 // MustStringArray guarantees the return of a `[]string` (with optional default) 309 // 310 // useful when you want to interate over array values in a succinct manner: 311 // for i, s := range js.Get("results").MustStringArray() { 312 // fmt.Println(i, s) 313 // } 314 func (j *Json) MustStringArray(args ...[]string) []string { 315 var def []string 316 317 switch len(args) { 318 case 0: 319 case 1: 320 def = args[0] 321 default: 322 log.Panicf("MustStringArray() received too many arguments %d", len(args)) 323 } 324 325 a, err := j.StringArray() 326 if err == nil { 327 return a 328 } 329 330 return def 331 } 332 333 // MustInt guarantees the return of an `int` (with optional default) 334 // 335 // useful when you explicitly want an `int` in a single value return context: 336 // myFunc(js.Get("param1").MustInt(), js.Get("optional_param").MustInt(5150)) 337 func (j *Json) MustInt(args ...int) int { 338 var def int 339 340 switch len(args) { 341 case 0: 342 case 1: 343 def = args[0] 344 default: 345 log.Panicf("MustInt() received too many arguments %d", len(args)) 346 } 347 348 i, err := j.Int() 349 if err == nil { 350 return i 351 } 352 353 return def 354 } 355 356 // MustFloat64 guarantees the return of a `float64` (with optional default) 357 // 358 // useful when you explicitly want a `float64` in a single value return context: 359 // myFunc(js.Get("param1").MustFloat64(), js.Get("optional_param").MustFloat64(5.150)) 360 func (j *Json) MustFloat64(args ...float64) float64 { 361 var def float64 362 363 switch len(args) { 364 case 0: 365 case 1: 366 def = args[0] 367 default: 368 log.Panicf("MustFloat64() received too many arguments %d", len(args)) 369 } 370 371 f, err := j.Float64() 372 if err == nil { 373 return f 374 } 375 376 return def 377 } 378 379 // MustBool guarantees the return of a `bool` (with optional default) 380 // 381 // useful when you explicitly want a `bool` in a single value return context: 382 // myFunc(js.Get("param1").MustBool(), js.Get("optional_param").MustBool(true)) 383 func (j *Json) MustBool(args ...bool) bool { 384 var def bool 385 386 switch len(args) { 387 case 0: 388 case 1: 389 def = args[0] 390 default: 391 log.Panicf("MustBool() received too many arguments %d", len(args)) 392 } 393 394 b, err := j.Bool() 395 if err == nil { 396 return b 397 } 398 399 return def 400 } 401 402 // MustInt64 guarantees the return of an `int64` (with optional default) 403 // 404 // useful when you explicitly want an `int64` in a single value return context: 405 // myFunc(js.Get("param1").MustInt64(), js.Get("optional_param").MustInt64(5150)) 406 func (j *Json) MustInt64(args ...int64) int64 { 407 var def int64 408 409 switch len(args) { 410 case 0: 411 case 1: 412 def = args[0] 413 default: 414 log.Panicf("MustInt64() received too many arguments %d", len(args)) 415 } 416 417 i, err := j.Int64() 418 if err == nil { 419 return i 420 } 421 422 return def 423 } 424 425 // MustUInt64 guarantees the return of an `uint64` (with optional default) 426 // 427 // useful when you explicitly want an `uint64` in a single value return context: 428 // myFunc(js.Get("param1").MustUint64(), js.Get("optional_param").MustUint64(5150)) 429 func (j *Json) MustUint64(args ...uint64) uint64 { 430 var def uint64 431 432 switch len(args) { 433 case 0: 434 case 1: 435 def = args[0] 436 default: 437 log.Panicf("MustUint64() received too many arguments %d", len(args)) 438 } 439 440 i, err := j.Uint64() 441 if err == nil { 442 return i 443 } 444 445 return def 446 }