#if defined _easyjson_included #endinput #endif #define _easyjson_included enum JSONType { Type_String, Type_Integer, Type_Float, Type_Object, Type_Boolean, Type_Array } stock Handle:CreateJSON() { new Handle:m_hJSON = CreateTrie(); new Handle:m_hJSONKeys = CreateArray(512); SetTrieValue(m_hJSON, "json_key_array", m_hJSONKeys); return m_hJSON; } stock Handle:DecodeJSON(const String:json[], &len=0) { decl m_iPos, m_iIgnore; new m_iLength = strlen(json); m_iPos = JSONIgnore(json); if(m_iPos == -1 || json[m_iPos] != '{') return INVALID_HANDLE; ++m_iPos; m_iIgnore = JSONIgnore(json[m_iPos]); if(m_iIgnore == -1) return INVALID_HANDLE; m_iPos += m_iIgnore; if(json[m_iPos] == '}') return INVALID_HANDLE; decl m_iStringStart; decl m_iStringEnd; new bool:m_bEnd = false; new Handle:m_hJSON = CreateJSON(); while(m_iPos= maxlen) return; new String:m_szTabs[tabs+1]; if(beautify) for(new i=0;i= maxlen) return; if(m_iKeys != i+1) { output[m_iPos] = ','; ++m_iPos; } if(m_iPos >= maxlen) return; if(beautify) { output[m_iPos] = '\n'; ++m_iPos; } } if(m_iPos < maxlen) { m_szTabs[tabs-1] = 0; m_iPos += Format(output[m_iPos], maxlen-m_iPos, "%s}", m_szTabs); } if(len != 0) len=m_iPos; } stock EncodeArray(&Handle:json, String:output[], maxlen, bool:beautify=true, &len=0, tabs=1) { decl Handle:m_hObject; if(2 >= maxlen) return; new String:m_szTabs[tabs+1]; if(beautify) for(new i=0;i= maxlen) return; if(m_iKeys != i+1) { output[m_iPos] = ','; ++m_iPos; } if(m_iPos >= maxlen) return; if(beautify) { output[m_iPos] = '\n'; ++m_iPos; } } if(m_iPos < maxlen) { m_szTabs[tabs-1] = 0; m_iPos += Format(output[m_iPos], maxlen-m_iPos, "%s]", m_szTabs); } if(len != 0) len=m_iPos-1; } stock JSONSetString(&Handle:json, const String:key[], const String:value[]) { new Handle:m_hKeyArray = INVALID_HANDLE; if(!GetTrieValue(json, "json_key_array", m_hKeyArray)) return; PushArrayString(m_hKeyArray, key); new Handle:m_hObject = JSONCreateString(value); SetTrieValue(json, key, m_hObject); } stock JSONSetBoolean(&Handle:json, const String:key[], bool:value) { new Handle:m_hKeyArray = INVALID_HANDLE; if(!GetTrieValue(json, "json_key_array", m_hKeyArray)) return; PushArrayString(m_hKeyArray, key); new Handle:m_hObject = JSONCreateBoolean(value); SetTrieValue(json, key, m_hObject); } stock JSONSetInteger(&Handle:json, const String:key[], value) { new Handle:m_hKeyArray = INVALID_HANDLE; if(!GetTrieValue(json, "json_key_array", m_hKeyArray)) return; PushArrayString(m_hKeyArray, key); new Handle:m_hObject = JSONCreateInteger(value); SetTrieValue(json, key, m_hObject); } stock JSONSetFloat(&Handle:json, const String:key[], Float:value) { new Handle:m_hKeyArray = INVALID_HANDLE; if(!GetTrieValue(json, "json_key_array", m_hKeyArray)) return; PushArrayString(m_hKeyArray, key); new Handle:m_hObject = JSONCreateFloat(value); SetTrieValue(json, key, m_hObject); } stock JSONSetObject(&Handle:json, const String:key[], Handle:value) { new Handle:m_hKeyArray = INVALID_HANDLE; if(!GetTrieValue(json, "json_key_array", m_hKeyArray)) return; PushArrayString(m_hKeyArray, key); new Handle:m_hObject = JSONCreateObject(value); SetTrieValue(json, key, m_hObject); } stock JSONSetArray(&Handle:json, const String:key[], Handle:value) { new Handle:m_hKeyArray = INVALID_HANDLE; if(!GetTrieValue(json, "json_key_array", m_hKeyArray)) return; PushArrayString(m_hKeyArray, key); new Handle:m_hObject = JSONCreateArray(value); SetTrieValue(json, key, m_hObject); } stock Handle:JSONCreateString(const String:value[]) { new Handle:m_hObject = CreateTrie(); SetTrieString(m_hObject, "value", value); SetTrieValue(m_hObject, "type", Type_String); SetTrieValue(m_hObject, "size", strlen(value)); return m_hObject; } stock Handle:JSONCreateBoolean(bool:value) { new Handle:m_hObject = CreateTrie(); SetTrieValue(m_hObject, "value", value); SetTrieValue(m_hObject, "type", Type_Boolean); SetTrieValue(m_hObject, "size", sizeof(value)); return m_hObject; } stock Handle:JSONCreateInteger(value) { new Handle:m_hObject = CreateTrie(); SetTrieValue(m_hObject, "value", value); SetTrieValue(m_hObject, "type", Type_Integer); SetTrieValue(m_hObject, "size", sizeof(value)); return m_hObject; } stock Handle:JSONCreateFloat(Float:value) { new Handle:m_hObject = CreateTrie(); SetTrieValue(m_hObject, "value", value); SetTrieValue(m_hObject, "type", Type_Float); SetTrieValue(m_hObject, "size", sizeof(value)); return m_hObject; } stock Handle:JSONCreateObject(Handle:value) { new Handle:m_hObject = CreateTrie(); SetTrieValue(m_hObject, "value", value); SetTrieValue(m_hObject, "type", Type_Object); SetTrieValue(m_hObject, "size", sizeof(value)); return m_hObject; } stock Handle:JSONCreateArray(Handle:value) { new Handle:m_hObject = CreateTrie(); SetTrieValue(m_hObject, "value", value); SetTrieValue(m_hObject, "type", Type_Array); SetTrieValue(m_hObject, "size", sizeof(value)); return m_hObject; } stock bool:JSONGetString(&Handle:json, const String:key[], String:out[], maxlen) { decl Handle:m_hObject; if(!GetTrieValue(json, key, m_hObject)) return false; decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_String) return false; GetTrieString(m_hObject, "value", out, maxlen); return true; } stock bool:JSONGetObject(&Handle:json, const String:key[], &Handle:out) { decl Handle:m_hObject; if(!GetTrieValue(json, key, m_hObject)) return false; decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_Object) return false; GetTrieValue(m_hObject, "value", out); return true; } stock bool:JSONGetArray(&Handle:json, const String:key[], &Handle:out) { decl Handle:m_hObject; if(!GetTrieValue(json, key, m_hObject)) return false; decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_Array) return false; GetTrieValue(m_hObject, "value", out); return true; } stock bool:JSONGetBoolean(&Handle:json, const String:key[], &bool:value) { decl Handle:m_hObject; if(!GetTrieValue(json, key, m_hObject)) return false; decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_Boolean) return false; GetTrieValue(m_hObject, "value", value); return true; } stock bool:JSONGetInteger(&Handle:json, const String:key[], &value) { decl Handle:m_hObject; if(!GetTrieValue(json, key, m_hObject)) return false; decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_Integer) return false; GetTrieValue(m_hObject, "value", value); return true; } stock bool:JSONGetFloat(&Handle:json, const String:key[], &Float:value) { decl Handle:m_hObject; if(!GetTrieValue(json, key, m_hObject)) return false; decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); // For compatibility reasons only, but you should follow strict types if(m_eType != Type_Float && m_eType != Type_Integer) return false; if(m_eType == Type_Integer) { decl m_iValue; GetTrieValue(m_hObject, "value", m_iValue); value = float(m_iValue); } else GetTrieValue(m_hObject, "value", value); return true; } stock bool:JSONGetArrayString(&Handle:array, idx, String:out[], maxlen) { new Handle:m_hObject = GetArrayCell(array, idx); decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_String) return false; GetTrieString(m_hObject, "value", out, maxlen); return true; } stock bool:JSONGetArrayObject(&Handle:array, idx, &Handle:out) { new Handle:m_hObject = GetArrayCell(array, idx); decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_Object) return false; GetTrieValue(m_hObject, "value", out); return true; } stock bool:JSONGetArrayArray(&Handle:array, idx, &Handle:out) { new Handle:m_hObject = GetArrayCell(array, idx); decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_Array) return false; GetTrieValue(m_hObject, "value", out); return true; } stock bool:JSONGetArrayBoolean(&Handle:array, idx, &bool:value) { new Handle:m_hObject = GetArrayCell(array, idx); decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_Boolean) return false; GetTrieValue(m_hObject, "value", value); return true; } stock bool:JSONGetArrayInteger(&Handle:array, idx, &value) { new Handle:m_hObject = GetArrayCell(array, idx); decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); if(m_eType != Type_Integer) return false; GetTrieValue(m_hObject, "value", value); return true; } stock bool:JSONGetArrayFloat(&Handle:array, idx, &Float:value) { new Handle:m_hObject = GetArrayCell(array, idx); decl JSONType:m_eType; GetTrieValue(m_hObject, "type", m_eType); // For compatibility reasons only, but you should follow strict types if(m_eType != Type_Float && m_eType != Type_Integer) return false; if(m_eType == Type_Integer) { decl m_iValue; GetTrieValue(m_hObject, "value", m_iValue); value = float(m_iValue); } else GetTrieValue(m_hObject, "value", value); return true; } stock JSONIgnore(const String:json[]) { new m_iLength = strlen(json); for(new i=0;i