)]}'
{
  "commit": "118c27a85e0d7e603b9df465c90f6413f55f4918",
  "tree": "047950b1824c603c2d22ec488b97a867b59d81c7",
  "parents": [
    "447cba6a09993580dfbdb9461c473270e4179911"
  ],
  "author": {
    "name": "Protobuf Team Bot",
    "email": "protobuf-github-bot@google.com",
    "time": "Wed Jun 03 09:45:06 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Wed Jun 03 09:47:51 2026 -0700"
  },
  "message": "Refactor C++ ProtoJSON to make odd handling of merge and nulls more obvious.\n\nThe intent of this change is to maintain the observable behavior, but make it obvious/explicit instead of subtle emergent behavior.\n\nMost notably:\n\n- Null values no-op, with the exception for fields which typed exactly as google.protobuf.Value, google.protobuf.NullValue. This behavior is per spec (those two are special cased so that they can be used to losslessly round trip arbitrary JSON). Note the behavior is technically outside of spec since it doesn\u0027t not enforce dupe keys but otherwise this case is aligned with spec.\n\n- Dupe key checking happens, and it either enforces only \"dupe values in same oneofs\" (if legacy_nonconformant bool is true, which it is by default), otherwise any dupe keys are enforced as a parse failure.\n\n- When the parse is provided with some dirty out parameter:\n   - If the top-level is Struct, ListValue and Value they are always eagerly cleared. Any other message types is not.\n\n   - Message-typed and repeated fields are cleared the first time a given key is seen. Subsequent cases within the same JSON have merge semantics (when dupe keys are allowed).\n\nBy hoisting the RecordSeen() behavior to the moment the key is seen instead of at the moment that each values would be written, this also is a small performance improvement in some cases, notably that we don\u0027t spam the RecordSeen on every individual field inside a repeated, and we don\u0027t ClearField() primitives. But the primary deliverable is clarity here.\n\nPiperOrigin-RevId: 926091511\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "e2631bde67374e90c684c22a275ebac5b425ddc9",
      "old_mode": 33188,
      "old_path": "src/google/protobuf/json/internal/parser.cc",
      "new_id": "926629118d66e4ef84dd4e41fa5410b640cf3b15",
      "new_mode": 33188,
      "new_path": "src/google/protobuf/json/internal/parser.cc"
    },
    {
      "type": "modify",
      "old_id": "74cf201e4e5c6d19aa1d096c12adcb3359b21693",
      "old_mode": 33188,
      "old_path": "src/google/protobuf/json/internal/parser_traits.h",
      "new_id": "ec18e3573ed35126751b380036b5407de5f2b35c",
      "new_mode": 33188,
      "new_path": "src/google/protobuf/json/internal/parser_traits.h"
    },
    {
      "type": "modify",
      "old_id": "7dc35624e3438bdc462efea8775ad6a91745ed25",
      "old_mode": 33188,
      "old_path": "src/google/protobuf/json/json_test.cc",
      "new_id": "54cd0ddbd25bc37f30db1ec1e87bd670e5bda92c",
      "new_mode": 33188,
      "new_path": "src/google/protobuf/json/json_test.cc"
    }
  ]
}
