From 77db07c479e49645c8a710bf630a5ad28d269a2c Mon Sep 17 00:00:00 2001 From: Taleh Zaliyev Date: Tue, 8 Jul 2025 15:55:35 +0300 Subject: [PATCH] [BAC-273] Stringify keys in from_json call --- lib/active_model/entity/parsers/json.rb | 3 +- spec/active_model/entity/parsers/json_spec.rb | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/active_model/entity/parsers/json.rb b/lib/active_model/entity/parsers/json.rb index 5f3a2b5..aa7c30f 100644 --- a/lib/active_model/entity/parsers/json.rb +++ b/lib/active_model/entity/parsers/json.rb @@ -14,11 +14,12 @@ def set_attribute_from_json(name, value) # Class-level methods. module ClassMethods def from_json(json) + unified_json = json.stringify_keys new.tap do |instance| instance.attributes.each_key do |name| field_name = name.camelize(:lower) - instance.set_attribute_from_json(name, json[field_name]) + instance.set_attribute_from_json(name, unified_json[field_name]) end end end diff --git a/spec/active_model/entity/parsers/json_spec.rb b/spec/active_model/entity/parsers/json_spec.rb index b70d8fe..0fd43b0 100644 --- a/spec/active_model/entity/parsers/json_spec.rb +++ b/spec/active_model/entity/parsers/json_spec.rb @@ -120,4 +120,44 @@ class Person }) end end + + context "parsing symbolized json" do + let(:source) do + { + fieldObj: { x: 1 }, + fieldBigInteger: 137, + fieldBoolean: false, + fieldDate: "2024-01-01", + fieldDatetime: "2024-01-01T01:03:07", + fieldFloat: 1.37, + fieldInteger: 138, + fieldString: "string", + fieldTime: "2024-02-03T01:03:08", + fieldRole: { fieldName: "nom", fieldNotMapped: "not_mapped", fieldPosition: { fieldName: "ceo" } }, + fieldRoles: [{ fieldName: "prenom", fieldPositions: [{ fieldName: "cpo" }] }], + fieldIntegers: [1, 3, 7], + fieldNotMapped: "not_mapped" + } + end + + it "loads an object" do + person = ParsersTest::Person.from_json(source) + + expect(person).to be_valid + expect(person.as_json.deep_symbolize_keys).to eq({ + field_obj: { x: 1 }, + field_big_integer: 137, + field_boolean: false, + field_date: "2024-01-01", + field_datetime: "2024-01-01T01:03:07.000Z", + field_float: 1.37, + field_integer: 138, + field_string: "string", + field_time: "2000-01-01T01:03:08.000Z", + field_role: { field_name: "nom", field_position: { field_name: "ceo" }, field_positions: nil }, + field_roles: [{ field_name: "prenom", field_position: nil, field_positions: [{ field_name: "cpo" }] }], + field_integers: [1, 3, 7] + }) + end + end end