decode.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package jsonpb
  5. import (
  6. "encoding/base64"
  7. "fmt"
  8. "math"
  9. "strconv"
  10. "strings"
  11. "github.com/golang/protobuf/v2/internal/encoding/json"
  12. "github.com/golang/protobuf/v2/internal/errors"
  13. "github.com/golang/protobuf/v2/internal/set"
  14. "github.com/golang/protobuf/v2/proto"
  15. pref "github.com/golang/protobuf/v2/reflect/protoreflect"
  16. )
  17. // Unmarshal reads the given []byte into the given proto.Message.
  18. func Unmarshal(m proto.Message, b []byte) error {
  19. return UnmarshalOptions{}.Unmarshal(m, b)
  20. }
  21. // UnmarshalOptions is a configurable JSON format parser.
  22. type UnmarshalOptions struct{}
  23. // Unmarshal reads the given []byte and populates the given proto.Message using
  24. // options in UnmarshalOptions object. It will clear the message first before
  25. // setting the fields. If it returns an error, the given message may be
  26. // partially set.
  27. func (o UnmarshalOptions) Unmarshal(m proto.Message, b []byte) error {
  28. mr := m.ProtoReflect()
  29. // TODO: Determine if we would like to have an option for merging or only
  30. // have merging behavior. We should at least be consistent with textproto
  31. // marshaling.
  32. resetMessage(mr)
  33. dec := decoder{json.NewDecoder(b)}
  34. var nerr errors.NonFatal
  35. if err := dec.unmarshalMessage(mr); !nerr.Merge(err) {
  36. return err
  37. }
  38. // Check for EOF.
  39. val, err := dec.Read()
  40. if err != nil {
  41. return err
  42. }
  43. if val.Type() != json.EOF {
  44. return unexpectedJSONError{val}
  45. }
  46. return nerr.E
  47. }
  48. // resetMessage clears all fields of given protoreflect.Message.
  49. func resetMessage(m pref.Message) {
  50. knownFields := m.KnownFields()
  51. knownFields.Range(func(num pref.FieldNumber, _ pref.Value) bool {
  52. knownFields.Clear(num)
  53. return true
  54. })
  55. unknownFields := m.UnknownFields()
  56. unknownFields.Range(func(num pref.FieldNumber, _ pref.RawFields) bool {
  57. unknownFields.Set(num, nil)
  58. return true
  59. })
  60. extTypes := knownFields.ExtensionTypes()
  61. extTypes.Range(func(xt pref.ExtensionType) bool {
  62. extTypes.Remove(xt)
  63. return true
  64. })
  65. }
  66. // unexpectedJSONError is an error that contains the unexpected json.Value. This
  67. // is used by decoder methods to provide callers the read json.Value that it
  68. // did not expect.
  69. // TODO: Consider moving this to internal/encoding/json for consistency with
  70. // errors that package returns.
  71. type unexpectedJSONError struct {
  72. value json.Value
  73. }
  74. func (e unexpectedJSONError) Error() string {
  75. return newError("unexpected value %s", e.value).Error()
  76. }
  77. // newError returns an error object. If one of the values passed in is of
  78. // json.Value type, it produces an error with position info.
  79. func newError(f string, x ...interface{}) error {
  80. var hasValue bool
  81. var line, column int
  82. for i := 0; i < len(x); i++ {
  83. if val, ok := x[i].(json.Value); ok {
  84. line, column = val.Position()
  85. hasValue = true
  86. break
  87. }
  88. }
  89. e := errors.New(f, x...)
  90. if hasValue {
  91. return errors.New("(line %d:%d): %v", line, column, e)
  92. }
  93. return e
  94. }
  95. // decoder decodes JSON into protoreflect values.
  96. type decoder struct {
  97. *json.Decoder
  98. }
  99. // unmarshalMessage unmarshals a message into the given protoreflect.Message.
  100. func (d decoder) unmarshalMessage(m pref.Message) error {
  101. var nerr errors.NonFatal
  102. var reqNums set.Ints
  103. var seenNums set.Ints
  104. msgType := m.Type()
  105. knownFields := m.KnownFields()
  106. fieldDescs := msgType.Fields()
  107. jval, err := d.Read()
  108. if !nerr.Merge(err) {
  109. return err
  110. }
  111. if jval.Type() != json.StartObject {
  112. return unexpectedJSONError{jval}
  113. }
  114. Loop:
  115. for {
  116. // Read field name.
  117. jval, err := d.Read()
  118. if !nerr.Merge(err) {
  119. return err
  120. }
  121. switch jval.Type() {
  122. default:
  123. return unexpectedJSONError{jval}
  124. case json.EndObject:
  125. break Loop
  126. case json.Name:
  127. // Continue below.
  128. }
  129. name, err := jval.Name()
  130. if !nerr.Merge(err) {
  131. return err
  132. }
  133. // Get the FieldDescriptor based on the field name. The name can either
  134. // be the JSON name for the field or the proto field name.
  135. fd := fieldDescs.ByJSONName(name)
  136. if fd == nil {
  137. fd = fieldDescs.ByName(pref.Name(name))
  138. }
  139. if fd == nil {
  140. // Field is unknown.
  141. // TODO: Provide option to ignore unknown message fields.
  142. return newError("%v contains unknown field %s", msgType.FullName(), jval)
  143. }
  144. // Do not allow duplicate fields.
  145. num := uint64(fd.Number())
  146. if seenNums.Has(num) {
  147. return newError("%v contains repeated field %s", msgType.FullName(), jval)
  148. }
  149. seenNums.Set(num)
  150. // No need to set values for JSON null.
  151. if d.Peek() == json.Null {
  152. d.Read()
  153. continue
  154. }
  155. if cardinality := fd.Cardinality(); cardinality == pref.Repeated {
  156. // Map or list fields have cardinality of repeated.
  157. if err := d.unmarshalRepeated(fd, knownFields); !nerr.Merge(err) {
  158. return errors.New("%v|%q: %v", fd.FullName(), name, err)
  159. }
  160. } else {
  161. // Required or optional fields.
  162. if err := d.unmarshalSingular(fd, knownFields); !nerr.Merge(err) {
  163. return errors.New("%v|%q: %v", fd.FullName(), name, err)
  164. }
  165. if cardinality == pref.Required {
  166. reqNums.Set(num)
  167. }
  168. }
  169. }
  170. // Check for any missing required fields.
  171. allReqNums := msgType.RequiredNumbers()
  172. if reqNums.Len() != allReqNums.Len() {
  173. for i := 0; i < allReqNums.Len(); i++ {
  174. if num := allReqNums.Get(i); !reqNums.Has(uint64(num)) {
  175. nerr.AppendRequiredNotSet(string(fieldDescs.ByNumber(num).FullName()))
  176. }
  177. }
  178. }
  179. return nerr.E
  180. }
  181. // unmarshalSingular unmarshals to the non-repeated field specified by the given
  182. // FieldDescriptor.
  183. func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, knownFields pref.KnownFields) error {
  184. var val pref.Value
  185. var err error
  186. num := fd.Number()
  187. switch fd.Kind() {
  188. case pref.MessageKind, pref.GroupKind:
  189. m := knownFields.NewMessage(num)
  190. err = d.unmarshalMessage(m)
  191. val = pref.ValueOf(m)
  192. default:
  193. val, err = d.unmarshalScalar(fd)
  194. }
  195. var nerr errors.NonFatal
  196. if !nerr.Merge(err) {
  197. return err
  198. }
  199. knownFields.Set(num, val)
  200. return nerr.E
  201. }
  202. // unmarshalScalar unmarshals to a scalar/enum protoreflect.Value specified by
  203. // the given FieldDescriptor.
  204. func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) {
  205. const b32 int = 32
  206. const b64 int = 64
  207. var nerr errors.NonFatal
  208. jval, err := d.Read()
  209. if !nerr.Merge(err) {
  210. return pref.Value{}, err
  211. }
  212. kind := fd.Kind()
  213. switch kind {
  214. case pref.BoolKind:
  215. return unmarshalBool(jval)
  216. case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
  217. return unmarshalInt(jval, b32)
  218. case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
  219. return unmarshalInt(jval, b64)
  220. case pref.Uint32Kind, pref.Fixed32Kind:
  221. return unmarshalUint(jval, b32)
  222. case pref.Uint64Kind, pref.Fixed64Kind:
  223. return unmarshalUint(jval, b64)
  224. case pref.FloatKind:
  225. return unmarshalFloat(jval, b32)
  226. case pref.DoubleKind:
  227. return unmarshalFloat(jval, b64)
  228. case pref.StringKind:
  229. pval, err := unmarshalString(jval)
  230. if !nerr.Merge(err) {
  231. return pval, err
  232. }
  233. return pval, nerr.E
  234. case pref.BytesKind:
  235. return unmarshalBytes(jval)
  236. case pref.EnumKind:
  237. return unmarshalEnum(jval, fd)
  238. }
  239. panic(fmt.Sprintf("invalid scalar kind %v", kind))
  240. }
  241. func unmarshalBool(jval json.Value) (pref.Value, error) {
  242. if jval.Type() != json.Bool {
  243. return pref.Value{}, unexpectedJSONError{jval}
  244. }
  245. b, err := jval.Bool()
  246. return pref.ValueOf(b), err
  247. }
  248. func unmarshalInt(jval json.Value, bitSize int) (pref.Value, error) {
  249. switch jval.Type() {
  250. case json.Number:
  251. return getInt(jval, bitSize)
  252. case json.String:
  253. // Use another decoder to decode number from string.
  254. dec := decoder{json.NewDecoder([]byte(jval.String()))}
  255. var nerr errors.NonFatal
  256. jval, err := dec.Read()
  257. if !nerr.Merge(err) {
  258. return pref.Value{}, err
  259. }
  260. return getInt(jval, bitSize)
  261. }
  262. return pref.Value{}, unexpectedJSONError{jval}
  263. }
  264. func getInt(jval json.Value, bitSize int) (pref.Value, error) {
  265. n, err := jval.Int(bitSize)
  266. if err != nil {
  267. return pref.Value{}, err
  268. }
  269. if bitSize == 32 {
  270. return pref.ValueOf(int32(n)), nil
  271. }
  272. return pref.ValueOf(n), nil
  273. }
  274. func unmarshalUint(jval json.Value, bitSize int) (pref.Value, error) {
  275. switch jval.Type() {
  276. case json.Number:
  277. return getUint(jval, bitSize)
  278. case json.String:
  279. // Use another decoder to decode number from string.
  280. dec := decoder{json.NewDecoder([]byte(jval.String()))}
  281. var nerr errors.NonFatal
  282. jval, err := dec.Read()
  283. if !nerr.Merge(err) {
  284. return pref.Value{}, err
  285. }
  286. return getUint(jval, bitSize)
  287. }
  288. return pref.Value{}, unexpectedJSONError{jval}
  289. }
  290. func getUint(jval json.Value, bitSize int) (pref.Value, error) {
  291. n, err := jval.Uint(bitSize)
  292. if err != nil {
  293. return pref.Value{}, err
  294. }
  295. if bitSize == 32 {
  296. return pref.ValueOf(uint32(n)), nil
  297. }
  298. return pref.ValueOf(n), nil
  299. }
  300. func unmarshalFloat(jval json.Value, bitSize int) (pref.Value, error) {
  301. switch jval.Type() {
  302. case json.Number:
  303. return getFloat(jval, bitSize)
  304. case json.String:
  305. s := jval.String()
  306. switch s {
  307. case "NaN":
  308. if bitSize == 32 {
  309. return pref.ValueOf(float32(math.NaN())), nil
  310. }
  311. return pref.ValueOf(math.NaN()), nil
  312. case "Infinity":
  313. if bitSize == 32 {
  314. return pref.ValueOf(float32(math.Inf(+1))), nil
  315. }
  316. return pref.ValueOf(math.Inf(+1)), nil
  317. case "-Infinity":
  318. if bitSize == 32 {
  319. return pref.ValueOf(float32(math.Inf(-1))), nil
  320. }
  321. return pref.ValueOf(math.Inf(-1)), nil
  322. }
  323. // Use another decoder to decode number from string.
  324. dec := decoder{json.NewDecoder([]byte(s))}
  325. var nerr errors.NonFatal
  326. jval, err := dec.Read()
  327. if !nerr.Merge(err) {
  328. return pref.Value{}, err
  329. }
  330. return getFloat(jval, bitSize)
  331. }
  332. return pref.Value{}, unexpectedJSONError{jval}
  333. }
  334. func getFloat(jval json.Value, bitSize int) (pref.Value, error) {
  335. n, err := jval.Float(bitSize)
  336. if err != nil {
  337. return pref.Value{}, err
  338. }
  339. if bitSize == 32 {
  340. return pref.ValueOf(float32(n)), nil
  341. }
  342. return pref.ValueOf(n), nil
  343. }
  344. func unmarshalString(jval json.Value) (pref.Value, error) {
  345. if jval.Type() != json.String {
  346. return pref.Value{}, unexpectedJSONError{jval}
  347. }
  348. return pref.ValueOf(jval.String()), nil
  349. }
  350. func unmarshalBytes(jval json.Value) (pref.Value, error) {
  351. if jval.Type() != json.String {
  352. return pref.Value{}, unexpectedJSONError{jval}
  353. }
  354. s := jval.String()
  355. enc := base64.StdEncoding
  356. if strings.ContainsAny(s, "-_") {
  357. enc = base64.URLEncoding
  358. }
  359. if len(s)%4 != 0 {
  360. enc = enc.WithPadding(base64.NoPadding)
  361. }
  362. b, err := enc.DecodeString(s)
  363. if err != nil {
  364. return pref.Value{}, err
  365. }
  366. return pref.ValueOf(b), nil
  367. }
  368. func unmarshalEnum(jval json.Value, fd pref.FieldDescriptor) (pref.Value, error) {
  369. switch jval.Type() {
  370. case json.String:
  371. // Lookup EnumNumber based on name.
  372. s := jval.String()
  373. if enumVal := fd.EnumType().Values().ByName(pref.Name(s)); enumVal != nil {
  374. return pref.ValueOf(enumVal.Number()), nil
  375. }
  376. return pref.Value{}, newError("invalid enum value %q", jval)
  377. case json.Number:
  378. n, err := jval.Int(32)
  379. if err != nil {
  380. return pref.Value{}, err
  381. }
  382. return pref.ValueOf(pref.EnumNumber(n)), nil
  383. }
  384. return pref.Value{}, unexpectedJSONError{jval}
  385. }
  386. // unmarshalRepeated unmarshals into a repeated field.
  387. func (d decoder) unmarshalRepeated(fd pref.FieldDescriptor, knownFields pref.KnownFields) error {
  388. var nerr errors.NonFatal
  389. num := fd.Number()
  390. val := knownFields.Get(num)
  391. if !fd.IsMap() {
  392. if err := d.unmarshalList(fd, val.List()); !nerr.Merge(err) {
  393. return err
  394. }
  395. } else {
  396. if err := d.unmarshalMap(fd, val.Map()); !nerr.Merge(err) {
  397. return err
  398. }
  399. }
  400. return nerr.E
  401. }
  402. // unmarshalList unmarshals into given protoreflect.List.
  403. func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error {
  404. var nerr errors.NonFatal
  405. jval, err := d.Read()
  406. if !nerr.Merge(err) {
  407. return err
  408. }
  409. if jval.Type() != json.StartArray {
  410. return unexpectedJSONError{jval}
  411. }
  412. switch fd.Kind() {
  413. case pref.MessageKind, pref.GroupKind:
  414. for {
  415. m := list.NewMessage()
  416. err := d.unmarshalMessage(m)
  417. if !nerr.Merge(err) {
  418. if e, ok := err.(unexpectedJSONError); ok {
  419. if e.value.Type() == json.EndArray {
  420. // Done with list.
  421. return nerr.E
  422. }
  423. }
  424. return err
  425. }
  426. list.Append(pref.ValueOf(m))
  427. }
  428. default:
  429. for {
  430. val, err := d.unmarshalScalar(fd)
  431. if !nerr.Merge(err) {
  432. if e, ok := err.(unexpectedJSONError); ok {
  433. if e.value.Type() == json.EndArray {
  434. // Done with list.
  435. return nerr.E
  436. }
  437. }
  438. return err
  439. }
  440. list.Append(val)
  441. }
  442. }
  443. return nerr.E
  444. }
  445. // unmarshalMap unmarshals into given protoreflect.Map.
  446. func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error {
  447. var nerr errors.NonFatal
  448. jval, err := d.Read()
  449. if !nerr.Merge(err) {
  450. return err
  451. }
  452. if jval.Type() != json.StartObject {
  453. return unexpectedJSONError{jval}
  454. }
  455. fields := fd.MessageType().Fields()
  456. keyDesc := fields.ByNumber(1)
  457. valDesc := fields.ByNumber(2)
  458. // Determine ahead whether map entry is a scalar type or a message type in
  459. // order to call the appropriate unmarshalMapValue func inside the for loop
  460. // below.
  461. unmarshalMapValue := func() (pref.Value, error) {
  462. return d.unmarshalScalar(valDesc)
  463. }
  464. switch valDesc.Kind() {
  465. case pref.MessageKind, pref.GroupKind:
  466. unmarshalMapValue = func() (pref.Value, error) {
  467. m := mmap.NewMessage()
  468. if err := d.unmarshalMessage(m); err != nil {
  469. return pref.Value{}, err
  470. }
  471. return pref.ValueOf(m), nil
  472. }
  473. }
  474. Loop:
  475. for {
  476. // Read field name.
  477. jval, err := d.Read()
  478. if !nerr.Merge(err) {
  479. return err
  480. }
  481. switch jval.Type() {
  482. default:
  483. return unexpectedJSONError{jval}
  484. case json.EndObject:
  485. break Loop
  486. case json.Name:
  487. // Continue.
  488. }
  489. name, err := jval.Name()
  490. if !nerr.Merge(err) {
  491. return err
  492. }
  493. // Unmarshal field name.
  494. pkey, err := unmarshalMapKey(name, keyDesc)
  495. if !nerr.Merge(err) {
  496. return err
  497. }
  498. // Check for duplicate field name.
  499. if mmap.Has(pkey) {
  500. return newError("duplicate map key %q", jval)
  501. }
  502. // Read and unmarshal field value.
  503. pval, err := unmarshalMapValue()
  504. if !nerr.Merge(err) {
  505. return err
  506. }
  507. mmap.Set(pkey, pval)
  508. }
  509. return nerr.E
  510. }
  511. // unmarshalMapKey converts given string into a protoreflect.MapKey. A map key type is any
  512. // integral or string type.
  513. func unmarshalMapKey(name string, fd pref.FieldDescriptor) (pref.MapKey, error) {
  514. const b32 = 32
  515. const b64 = 64
  516. const base10 = 10
  517. kind := fd.Kind()
  518. switch kind {
  519. case pref.StringKind:
  520. return pref.ValueOf(name).MapKey(), nil
  521. case pref.BoolKind:
  522. switch name {
  523. case "true":
  524. return pref.ValueOf(true).MapKey(), nil
  525. case "false":
  526. return pref.ValueOf(false).MapKey(), nil
  527. }
  528. return pref.MapKey{}, errors.New("invalid value for boolean key %q", name)
  529. case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
  530. n, err := strconv.ParseInt(name, base10, b32)
  531. if err != nil {
  532. return pref.MapKey{}, err
  533. }
  534. return pref.ValueOf(int32(n)).MapKey(), nil
  535. case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
  536. n, err := strconv.ParseInt(name, base10, b64)
  537. if err != nil {
  538. return pref.MapKey{}, err
  539. }
  540. return pref.ValueOf(int64(n)).MapKey(), nil
  541. case pref.Uint32Kind, pref.Fixed32Kind:
  542. n, err := strconv.ParseUint(name, base10, b32)
  543. if err != nil {
  544. return pref.MapKey{}, err
  545. }
  546. return pref.ValueOf(uint32(n)).MapKey(), nil
  547. case pref.Uint64Kind, pref.Fixed64Kind:
  548. n, err := strconv.ParseUint(name, base10, b64)
  549. if err != nil {
  550. return pref.MapKey{}, err
  551. }
  552. return pref.ValueOf(uint64(n)).MapKey(), nil
  553. }
  554. panic(fmt.Sprintf("%s: invalid kind %s for map key", fd.FullName(), kind))
  555. }