in source/ota.c [1756:1833]
static DocParseErr_t parseJSONbyModel( const char * pJson,
uint32_t messageLength,
JsonDocModel_t * pDocModel )
{
const JsonDocParam_t * pModelParam = NULL;
DocParseErr_t err;
JSONStatus_t result;
uint16_t paramIndex = 0;
const char * pFileParams = NULL;
uint32_t fileParamsLength = 0;
LogDebug( ( "JSON received: %s", pJson ) );
/* Fetch the model parameters from the DocModel*/
pModelParam = pDocModel->pBodyDef;
/* Check the validity of the JSON document */
err = validateJSON( pJson, messageLength );
/* Traverse the docModel and search the JSON if it containing the Source Key specified*/
for( paramIndex = 0; paramIndex < pDocModel->numModelParams; paramIndex++ )
{
const char * pQueryKey = pDocModel->pBodyDef[ paramIndex ].pSrcKey;
size_t queryKeyLength = strlen( pQueryKey );
const char * pValueInJson = NULL;
size_t valueLength = 0;
result = JSON_SearchConst( pJson, messageLength, pQueryKey, queryKeyLength, &pValueInJson, &valueLength, NULL );
/* If not found in pJSon search for the key in FileParameters JSON*/
if( ( result != JSONSuccess ) && ( pFileParams != NULL ) )
{
result = JSON_SearchConst( pFileParams, fileParamsLength, pQueryKey, queryKeyLength, &pValueInJson, &valueLength, NULL );
}
if( result == JSONSuccess )
{
/* Mark parameter as received in the bitmap. */
pDocModel->paramsReceivedBitmap |= ( ( uint32_t ) 1U << paramIndex );
if( OTA_DONT_STORE_PARAM == ( int32_t ) pModelParam[ paramIndex ].pDestOffset )
{
/* Do nothing if we don't need to store the parameter */
continue;
}
else if( OTA_STORE_NESTED_JSON == pModelParam[ paramIndex ].pDestOffset )
{
pFileParams = pValueInJson + 1;
fileParamsLength = ( uint32_t ) valueLength - 2U;
}
else
{
err = extractParameter( pModelParam[ paramIndex ],
pDocModel->contextBase,
pValueInJson,
valueLength );
}
if( err != DocParseErrNone )
{
break;
}
}
}
if( err == DocParseErrNone )
{
err = verifyRequiredParamsExtracted( pModelParam, pDocModel );
}
if( err != DocParseErrNone )
{
LogDebug( ( "Failed to parse JSON document as AFR_OTA job: "
"DocParseErr_t=%d",
err ) );
}
return err;
}