in JSLib/src/odata-json-light.js [1032:1132]
var jsonLightPayloadInfo = function (data, model, inferFeedAsComplexType) {
/// <summary>Infers the information describing the JSON light payload from its metadata annotation, structure, and data model.</summary>
/// <param name="data" type="Object">Json light response payload object.</param>
/// <param name="model" type="Object">Object describing an OData conceptual schema.</param>
/// <param name="inferFeedAsComplexType" type="Boolean">True if a JSON light payload that looks like a feed should be treated as a complex type property instead.</param>
/// <remarks>
/// If the arguments passed to the function don't convey enough information about the payload to determine without doubt that the payload is a feed then it
/// will try to use the payload object structure instead. If the payload looks like a feed (has value property that is an array or non-primitive values) then
/// the function will report its kind as PAYLOADTYPE_FEED unless the inferFeedAsComplexType flag is set to true. This flag comes from the user request
/// and allows the user to control how the library behaves with an ambigous JSON light payload.
/// </remarks>
/// <returns type="Object">
/// Object with kind and type fields. Null if there is no metadata annotation or the payload info cannot be obtained..
/// </returns>
var metadataUri = data[metadataAnnotation];
if (!metadataUri || typeof metadataUri !== "string") {
return null;
}
var fragmentStart = metadataUri.lastIndexOf("#");
if (fragmentStart === -1) {
return jsonLightMakePayloadInfo(PAYLOADTYPE_SVCDOC);
}
var elementStart = metadataUri.indexOf("@Element", fragmentStart);
var fragmentEnd = elementStart - 1;
if (fragmentEnd < 0) {
fragmentEnd = metadataUri.indexOf("?", fragmentStart);
if (fragmentEnd === -1) {
fragmentEnd = metadataUri.length;
}
}
var fragment = decodeURIComponent(metadataUri.substring(fragmentStart + 1, fragmentEnd));
if (fragment.indexOf("/$links/") > 0) {
return jsonLightMakePayloadInfo(PAYLOADTYPE_LINKS);
}
var fragmentParts = fragment.split("/");
if (fragmentParts.length >= 0) {
var qualifiedName = fragmentParts[0];
var typeCast = fragmentParts[1];
if (jsonLightIsPrimitiveType(qualifiedName)) {
return jsonLightMakePayloadInfo(PAYLOADTYPE_PRIMITIVE, qualifiedName);
}
if (isCollectionType(qualifiedName)) {
return jsonLightMakePayloadInfo(PAYLOADTYPE_COLLECTION, qualifiedName);
}
var entityType = typeCast;
var entitySet, functionImport, containerName;
if (!typeCast) {
var nsEnd = qualifiedName.lastIndexOf(".");
var simpleName = qualifiedName.substring(nsEnd + 1);
var container = (simpleName === qualifiedName) ?
lookupDefaultEntityContainer(model) :
lookupEntityContainer(qualifiedName.substring(0, nsEnd), model);
if (container) {
entitySet = lookupEntitySet(container.entitySet, simpleName);
functionImport = container.functionImport;
containerName = container.name;
entityType = !!entitySet ? entitySet.entityType : null;
}
}
var info;
if (elementStart > 0) {
info = jsonLightMakePayloadInfo(PAYLOADTYPE_OBJECT, entityType);
info.entitySet = entitySet;
info.functionImport = functionImport;
info.containerName = containerName;
return info;
}
if (entityType) {
info = jsonLightMakePayloadInfo(PAYLOADTYPE_FEED, entityType);
info.entitySet = entitySet;
info.functionImport = functionImport;
info.containerName = containerName;
return info;
}
if (isArray(data.value) && !lookupComplexType(qualifiedName, model)) {
var item = data.value[0];
if (!isPrimitive(item)) {
if (jsonLightIsEntry(item) || !inferFeedAsComplexType) {
return jsonLightMakePayloadInfo(PAYLOADTYPE_FEED, null);
}
}
}
return jsonLightMakePayloadInfo(PAYLOADTYPE_OBJECT, qualifiedName);
}
return null;
};