Guest User

Untitled

a guest
Dec 15th, 2024
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.73 KB | None | 0 0
  1. package sqldb
  2.  
  3. import (
  4.     "encoding/json"
  5.     "strconv"
  6.     "strings"
  7. )
  8.  
  9. type pair struct {
  10.     k string
  11.     v interface{}
  12. }
  13.  
  14. func convertStrings(m map[string]interface{}) (map[string]interface{}, error) {
  15.     for k, v := range m {
  16.         switch v := v.(type) {
  17.         case string:
  18.             tmp := strconv.QuoteToASCII(v)
  19.             // \\x00 is escaped but for some reason json.Marshal doesn't like it
  20.             // seems like a Marshalling bug to me? \\x00 should be treated as a raw string.
  21.             tmp = strings.ReplaceAll(tmp, "\\x00", "\\u0000")
  22.             m[k] = json.RawMessage(tmp)
  23.         case map[string]interface{}:
  24.             convertedInner, err := convertStrings(v)
  25.             if err != nil {
  26.                 return nil, err
  27.             }
  28.             m[k] = convertedInner
  29.         case []any:
  30.             newList := []any{}
  31.             for _, val := range v {
  32.                 // bit of a hack to reuse code
  33.                 valM := map[string]interface{}{"entry": val}
  34.                 retVal, err := convertStrings(valM)
  35.                 if err != nil {
  36.                     return nil, err
  37.                 }
  38.                 newList = append(newList, retVal["entry"])
  39.             }
  40.             m[k] = newList
  41.         default:
  42.             m[k] = v
  43.         }
  44.     }
  45.     return m, nil
  46. }
  47.  
  48. func convertMap(jsonObject any) (map[string]interface{}, error) {
  49.  
  50.     bytes, err := json.Marshal(jsonObject)
  51.     if err != nil {
  52.         return nil, err
  53.     }
  54.     // we do this to handle json tags without explicitly programming this
  55.     // ourselves.
  56.     oldMap := make(map[string]interface{})
  57.     err = json.Unmarshal(bytes, &oldMap)
  58.     if err != nil {
  59.         return nil, err
  60.     }
  61.  
  62.     newMap, err := convertStrings(oldMap)
  63.     if err != nil {
  64.         return nil, err
  65.     }
  66.  
  67.     return newMap, nil
  68. }
  69.  
  70. func jsonMarshallRawStrings(jsonObject any) ([]byte, error) {
  71.     m, err := convertMap(jsonObject)
  72.     if err != nil {
  73.         return nil, err
  74.     }
  75.     b, err := json.Marshal(m)
  76.     if err != nil {
  77.         return nil, err
  78.     }
  79.     return b, nil
  80. }
  81.  
Advertisement
Add Comment
Please, Sign In to add comment