dotnet/AspNetCore.Docs · error · Error

ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead.

Error message

ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!

What it means

knockout.mapping removed updateFromJSON the same way it removed updateFromJS. The stub always throws and points to fromJSON. Because fromJSON parses a JSON string internally and forwards to fromJS, the argument order is again different (jsonString first, then target). The message is an intentional deprecation breadcrumb.

Source

Thrown at aspnetcore/mvc/controllers/testing/samples/2.x/TestingControllersSample/src/TestingControllersSample/wwwroot/js/knockout.mapping.js:148

			return result;
		} catch(e) {
			mappingNesting = 0;
			throw e;
		}
	};

	exports.fromJSON = function (jsonString /*, options, target*/ ) {
		var parsed = ko.utils.parseJson(jsonString);
		arguments[0] = parsed;
		return exports.fromJS.apply(this, arguments);
	};

	exports.updateFromJS = function (viewModel) {
		throw new Error("ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!");
	};

	exports.updateFromJSON = function (viewModel) {
		throw new Error("ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!");
	};

	exports.toJS = function (rootObject, options) {
		if (!defaultOptions) exports.resetDefaultOptions();

		if (arguments.length == 0) throw new Error("When calling ko.mapping.toJS, pass the object you want to convert.");
		if (exports.getType(defaultOptions.ignore) !== "array") throw new Error("ko.mapping.defaultOptions().ignore should be an array.");
		if (exports.getType(defaultOptions.include) !== "array") throw new Error("ko.mapping.defaultOptions().include should be an array.");
		if (exports.getType(defaultOptions.copy) !== "array") throw new Error("ko.mapping.defaultOptions().copy should be an array.");

		// Merge in the options used in fromJS
		options = fillOptions(options, rootObject[mappingProperty]);

		// We just unwrap everything at every level in the object graph
		return exports.visitModel(rootObject, function (x) {
			return ko.utils.unwrapObservable(x)
		}, options);
	};

View on GitHub (pinned to c67a80103a)

Solutions

  1. Replace ko.mapping.updateFromJSON(viewModel, jsonString) with ko.mapping.fromJSON(jsonString, viewModel).
  2. Migrate any sibling updateFromJS calls at the same time for consistency.

Example fix

// before
ko.mapping.updateFromJSON(viewModel, jsonString);
// after
ko.mapping.fromJSON(jsonString, viewModel);
Defensive patterns

Strategy: validation

Validate before calling

// Compat shim for the removed updateFromJSON.
function updateFromJSONCompat(viewModel, jsonString) {
  if (typeof jsonString !== 'string') {
    throw new TypeError('updateFromJSON requires a JSON string');
  }
  return ko.mapping.fromJSON(jsonString, viewModel); // order swapped
}

Type guard

function isJsonString(x) { return typeof x === 'string' && x.trim().charAt(0) === '{' || x.trim().charAt(0) === '['; }

Try / catch

try {
  ko.mapping.updateFromJSON(viewModel, jsonString);
} catch (e) {
  if (/use ko.mapping.fromJSON instead/.test(e.message)) {
    console.error('Deprecated: use ko.mapping.fromJSON(jsonString, viewModel)');
    ko.mapping.fromJSON(jsonString, viewModel);
  } else { throw e; }
}

Prevention

When it happens

Trigger: Calling ko.mapping.updateFromJSON(viewModel, jsonString) carried over from an old knockout.mapping version.

Common situations: Plugin upgrade; legacy code; old Stack Overflow answers.

Related errors


AI-assisted analysis of dotnet/AspNetCore.Docs@c67a80103a (2026-08-13). Data as JSON: /api/errors/16bf510c239fa202. Report an issue: GitHub.