Here's an example AE script to read in a value (in this example passed as a variable of the job itself):
:SET &JSON_PARSE# = STR_CUT(&JSON#,3)
:SET &JSON_LENGTH# = STR_LENGTH(&JSON_PARSE#)
:SET &JSON_LENGTH# = &JSON_LENGTH# - 2
:SET &JSON_LENGTH# = FORMAT(&JSON_LENGTH#,)
:SET &JSON_PARSE# = STR_CUT(&JSON_PARSE#,1,&JSON_LENGTH#)
:DEFINE &JSON_VALUES#, STRING, 99
:DEFINE &JSON_VAL#, STRING, 2
:FILL &JSON_VALUES#[] = STR_SPLIT(&JSON_PARSE#,", """)
:SET &ARRAY_NUM# = 1
:WHILE &JSON_VALUES#[&ARRAY_NUM#] <> ""
: IF &ARRAY_NUM# <> 1
: SET &JSON_VALUES#[&ARRAY_NUM#] = STR_CAT("""",&JSON_VALUES#[&ARRAY_NUM#])
: ENDIF
: FILL &JSON_VAL#[] = STR_SPLIT(&JSON_VALUES#[&ARRAY_NUM#],":")
: PRINT &JSON_VAL#[1] &JSON_VAL#[2]
: SET &ARRAY_NUM# = &ARRAY_NUM# + 1
:ENDWHILE
(Apparently they changed how the Code block works, it reads in AE scripting weirdly and adds extra lines now, pasted as plaintext instead)
Given the format you provided, this should correctly parse your data, though in its current form the value name still contains quotations and the "age" is set as a String (though this can easily be converted to a number with a simple IS_NUMERIC check and then a CONVERT). Bear in mind this example is fairly basic and may provide false positives if your data contains ', "'.
Result:
2017-04-03 16:11:22 - U00020206 Variable '&JSON#' was stored with value '{ "firstname":"John", "lastname":"Carter", "age":30 }'.
2017-04-03 16:11:22 - U00020408 "firstname" "John"
2017-04-03 16:11:22 - U00020408 "lastname" "Carter"
2017-04-03 16:11:22 - U00020408 "age" 30