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
- Replace ko.mapping.updateFromJSON(viewModel, jsonString) with ko.mapping.fromJSON(jsonString, viewModel).
- 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
- Remove all updateFromJSON usages when upgrading knockout.mapping.
- Argument order is swapped: JSON string first, then target.
- Add an ESLint/custom lint rule banning updateFromJSON/updateFromJS.
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
- ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Plea
- When calling ko.fromJS, pass the object you want to convert.
- When calling ko.mapping.toJS, pass the object you want to co
- ko.mapping.defaultOptions().ignore should be an array.
- ko.mapping.defaultOptions().include should be an array.
AI-assisted analysis of dotnet/AspNetCore.Docs@c67a80103a (2026-08-13).
Data as JSON: /api/errors/16bf510c239fa202.
Report an issue: GitHub.