in JSLib/src/odata-json-light.js [510:600]
var jsonLightReadObject = function (data, objectInfo, baseURI, model, recognizeDates) {
/// <summary>Converts a JSON light entry or complex type object into its library representation.</summary>
/// <param name="data" type="Object">JSON light entry or complex type object to convert.</param>
/// <param name="objectInfo" type="Object">Information about the entry or complex.</param>
/// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
/// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
/// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
/// <returns type="Object">Entry or complex type object.</param>
objectInfo = objectInfo || {};
var actualType = data[typeAnnotation] || objectInfo.type || null;
var dataModel = lookupEntityType(actualType, model);
var isEntry = true;
if (!dataModel) {
isEntry = false;
dataModel = lookupComplexType(actualType, model);
}
var metadata = { type: actualType };
var obj = { __metadata: metadata };
var propertiesMetadata = {};
var baseTypeModel;
if (isEntry && dataModel && objectInfo.entitySet && objectInfo.contentTypeOdata == "minimalmetadata") {
var serviceURI = baseURI.substring(0, baseURI.lastIndexOf("$metadata"));
baseTypeModel = null; // check if the key model is in a parent type.
if (!dataModel.key) {
baseTypeModel = dataModel;
}
while (!!baseTypeModel && !baseTypeModel.key && baseTypeModel.baseType) {
baseTypeModel = lookupEntityType(baseTypeModel.baseType, model);
}
if (dataModel.key || (!!baseTypeModel && baseTypeModel.key)) {
var entryKey;
if (dataModel.key) {
entryKey = jsonLightGetEntryKey(data, dataModel);
} else {
entryKey = jsonLightGetEntryKey(data, baseTypeModel);
}
if (entryKey) {
var entryInfo = {
key: entryKey,
entitySet: objectInfo.entitySet,
functionImport: objectInfo.functionImport,
containerName: objectInfo.containerName
};
jsonLightComputeUrisIfMissing(data, entryInfo, actualType, serviceURI, dataModel, baseTypeModel);
}
}
}
for (var name in data) {
if (name.indexOf("#") === 0) {
// This is an advertised function or action.
jsonLightReadAdvertisedFunctionOrAction(name.substring(1), data[name], obj, baseURI, model);
} else {
// Is name NOT an annotation?
if (name.indexOf(".") === -1) {
if (!metadata.properties) {
metadata.properties = propertiesMetadata;
}
var propertyValue = data[name];
var propertyModel = propertyModel = jsonLightDataItemModel(name, dataModel);
baseTypeModel = dataModel;
while (!!dataModel && propertyModel === null && baseTypeModel.baseType) {
baseTypeModel = lookupEntityType(baseTypeModel.baseType, model);
propertyModel = propertyModel = jsonLightDataItemModel(name, baseTypeModel);
}
var isNavigationProperty = jsonLightIsNavigationProperty(name, data, propertyModel);
var propertyType = jsonLightDataItemType(name, propertyValue, data, propertyModel, model);
var propertyMetadata = propertiesMetadata[name] = propertiesMetadata[name] || { type: propertyType };
if (isNavigationProperty) {
var propertyInfo = {};
if (objectInfo.entitySet !== undefined) {
var navigationPropertyEntitySetName = lookupNavigationPropertyEntitySet(propertyModel, objectInfo.entitySet.name, model);
propertyInfo = getEntitySetInfo(navigationPropertyEntitySetName, model);
}
propertyInfo.contentTypeOdata = objectInfo.contentTypeOdata;
propertyInfo.kind = objectInfo.kind;
propertyInfo.type = propertyType;
obj[name] = jsonLightReadNavigationPropertyValue(propertyValue, propertyInfo, baseURI, model, recognizeDates);
} else {
obj[name] = jsonLightReadDataItemValue(propertyValue, propertyType, propertyMetadata, baseURI, propertyModel, model, recognizeDates);
}
}
}
}
return jsonLightReadDataAnnotations(data, obj, baseURI, dataModel, model);
};