JSON

Сообщения
893
Реакции
149
Помог
25 раз(а)
Здравствуйте, впервые начал разбираться с json форматом.

Имею вот такой json:
JSON:
{
    "weapon_ak47": [
        {
            "name": "AK-47",
            "clip": {
                "cost": [1, 2, 3],
                "value": [1, 2, 3]
            },
            "ammo": {
                "cost": [13],
                "value": [80]
            }
        }
    ],
    "weapon_awp": [
        {
            "name": "AWP",
            "clip": {
                "cost": [1, 2, 3],
                "value": [4, 5, 6]
            },
            "ammo": {
                "cost": [13],
                "value": [80]
            }
        }
    ]
}

И кусок кода с парсингом:
C++:
@Read__File() {
    if(!file_exists(FILE__PATH)) {
        set_fail_state("Invalid open file: ^"%s^"", FILE__PATH);
        return;
    }
    new JSON: JSON_Handle = json_parse(FILE__PATH, true);
    if(JSON_Handle == Invalid_JSON) {
        set_fail_state("Invalid read file: ^"%s^"", FILE__PATH);
        return;
    }
    new JSON_Size = json_object_get_count(JSON_Handle);
    if(!JSON_Size) {
        json_free(JSON_Handle);
        set_fail_state("File ^"%s^" is empty.", FILE__PATH);
        return;
    }
    g__ArrayWeapons = ArrayCreate(eArrayWeaponData);
    new ArrayWeaponData[eArrayWeaponData];
    new szBuffer[256];
    new WeaponSize, CostSize, ValueSize;
    new JSON: JSON_WeaponObject = Invalid_JSON;
    new JSON: JSON_WeaponArray = Invalid_JSON;
    new JSON: JSON_AbilityOjbect = Invalid_JSON;
    new JSON: JSON_Cost = Invalid_JSON;
    new JSON: JSON_Value = Invalid_JSON;
    for(new i; i < JSON_Size; i++) {
        json_object_get_name(JSON_Handle, i, szBuffer, charsmax(szBuffer));
        if(!szBuffer[0] || szBuffer[0] == '#')
            continue;
        if(contain(szBuffer, "weapon_") != -1) {
            JSON_WeaponObject = json_object_get_value(JSON_Handle, szBuffer);
            formatex(ArrayWeaponData[ARRAY__WEAPON_NAME], charsmax(ArrayWeaponData[ARRAY__WEAPON_NAME]), szBuffer);
            if(JSON_WeaponObject == Invalid_JSON)
                continue;
            WeaponSize = json_array_get_count(JSON_WeaponObject);
            for(new j; j < WeaponSize; j++) {
                JSON_WeaponArray = json_array_get_value(JSON_WeaponObject, j);
                if(JSON_WeaponArray != Invalid_JSON) {
                    if(json_object_has_value(JSON_WeaponArray, "name", JSONString)) {
                        json_object_get_string(JSON_WeaponArray, "name", ArrayWeaponData[ARRAY__WEAPON_MENU_NAME], charsmax(ArrayWeaponData[ARRAY__WEAPON_MENU_NAME]));
                    }
                    if(json_object_has_value(JSON_WeaponArray, "clip", JSONObject)) {
                        JSON_AbilityOjbect = json_object_get_value(JSON_WeaponArray, "clip");
                        
                        if(json_object_has_value(JSON_AbilityOjbect, "cost", JSONArray)) {
                            JSON_Cost = json_object_get_value(JSON_AbilityOjbect, "cost");
                            if(JSON_Cost != Invalid_JSON) {
                                CostSize = json_array_get_count(JSON_Cost);
                                for(new k; k < CostSize; k++) {
                                    server_print("%i", json_array_get_number(JSON_Cost, k));
                                }
                                json_free(JSON_Cost);
                            }
                        }
                        if(json_object_has_value(JSON_AbilityOjbect, "value", JSONArray)) {
                            JSON_Value = json_object_get_value(JSON_AbilityOjbect, "value");
                            if(JSON_Value != Invalid_JSON) {
                                ValueSize = json_array_get_count(JSON_Value);
                                for(new k; k < ValueSize; k++) {
                                    server_print("%i", json_array_get_number(JSON_Value, k));
                                }
                                json_free(JSON_Value);
                            }
                        }
                    }
                }
                ArrayPushArray(g__ArrayWeapons, ArrayWeaponData);
                json_free(JSON_WeaponArray);
            }
        }
        json_free(JSON_WeaponObject);
    }
    json_free(JSON_Handle);
    server_print("ArraySize: %i", ArraySize(g__ArrayWeapons));
}

Вопрос в следующем, возможно ли проверять объект на наличие не только clip
C++:
if(json_object_has_value(JSON_WeaponArray, "clip", JSONObject)) {
    JSON_AbilityOjbect = json_object_get_value(JSON_WeaponArray, "clip");
А и на другие, к примеру, ammo, при этом не добавляя отдельный кусок кода с проверкой на ammo?
Или это нереально?
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
если ты знаешь что у тебя в объекте однотипные значения, то еще можно константно создать массив с предопределенными значениями и крутить по нему цикл
только какой смысл, если у тебя лишь два значения
получится лего конструктор, вроде прикольно, но по факту бесполезно
 
Сообщения
893
Реакции
149
Помог
25 раз(а)
BalbuR, там будет побольше, это для примера. Но в целом, я разобрался.
Не знаю, насколько это правильно, но сделал таким методом:
C#:
@Read__File() {
    if(!file_exists(FILE__PATH)) {
        set_fail_state("Invalid open file: ^"%s^"", FILE__PATH);
        return;
    }

    new JSON: JSON_Handle = json_parse(FILE__PATH, true);

    if(JSON_Handle == Invalid_JSON) {
        set_fail_state("Invalid read file: ^"%s^"", FILE__PATH);
        return;
    }

    new JSON_Size = json_object_get_count(JSON_Handle);

    if(!JSON_Size) {
        json_free(JSON_Handle);

        set_fail_state("File ^"%s^" is empty.", FILE__PATH);
        return;
    }

    g__ArrayWeapons = ArrayCreate(eArrayWeaponData);
    new ArrayWeaponData[eArrayWeaponData];

    new szBuffer[256];
    new WeaponSize, CostSize, ValueSize, AbilityIndex;
    new JSON: JSON_WeaponObject = Invalid_JSON;
    new JSON: JSON_WeaponArray = Invalid_JSON;
    new JSON: JSON_AbilityOjbect = Invalid_JSON;
    new JSON: JSON_Cost = Invalid_JSON;
    new JSON: JSON_Value = Invalid_JSON;

    for(new i; i < JSON_Size; i++) {
        json_object_get_name(JSON_Handle, i, szBuffer, charsmax(szBuffer));

        if(!szBuffer[0] || szBuffer[0] == '#')
            continue;

        if(contain(szBuffer, "weapon_") != -1) {
            JSON_WeaponObject = json_object_get_value(JSON_Handle, szBuffer);
            formatex(ArrayWeaponData[ARRAY__WEAPON_NAME], charsmax(ArrayWeaponData[ARRAY__WEAPON_NAME]), szBuffer);

            if(JSON_WeaponObject == Invalid_JSON)
                continue;

            WeaponSize = json_array_get_count(JSON_WeaponObject);
            for(new j; j < WeaponSize; j++) {
                JSON_WeaponArray = json_array_get_value(JSON_WeaponObject, j);

                if(JSON_WeaponArray != Invalid_JSON) {
                    if(json_object_has_value(JSON_WeaponArray, "name", JSONString)) {
                        json_object_get_string(JSON_WeaponArray, "name", ArrayWeaponData[ARRAY__WEAPON_MENU_NAME], charsmax(ArrayWeaponData[ARRAY__WEAPON_MENU_NAME]));
                    }

                    new szAbilityList[] = {
                        "clip", "ammo", "damage",
                        "crit_chance", "crit_attack", "speed",
                        "deploy_time", "reload_time"
                    };

                    for(new i; i < sizeof(szAbilityList); i++) {
                        if(json_object_has_value(JSON_WeaponArray, szAbilityList[i], JSONObject)) {
                            JSON_AbilityOjbect = json_object_get_value(JSON_WeaponArray, szAbilityList[i]);
                            AbilityIndex = GetAbilityIndex(szAbilityList[i]);

                            #if defined __DEBUG
                                server_print("Index i = %i | AbilityName = %s | AbilityIndex = %i", i, szAbilityList[i], AbilityIndex);
                            #endif

                            if(json_object_has_value(JSON_AbilityOjbect, "cost", JSONArray)) {
                                JSON_Cost = json_object_get_value(JSON_AbilityOjbect, "cost");

                                if(JSON_Cost != Invalid_JSON) {
                                    CostSize = json_array_get_count(JSON_Cost);

                                    for(new k; k < CostSize; k++) {
                                        #if defined __DEBUG
                                            server_print("cost array = %i", json_array_get_number(JSON_Cost, k));
                                        #endif
                                    }

                                    json_free(JSON_Cost);
                                }
                            }
                            if(json_object_has_value(JSON_AbilityOjbect, "value", JSONArray)) {
                                JSON_Value = json_object_get_value(JSON_AbilityOjbect, "value");

                                if(JSON_Value != Invalid_JSON) {
                                    ValueSize = json_array_get_count(JSON_Value);

                                    for(new k; k < ValueSize; k++) {
                                        #if defined __DEBUG
                                            server_print("value array = %i", json_array_get_number(JSON_Value, k));
                                        #endif
                                    }

                                    json_free(JSON_Value);
                                }
                            }
                        }
                    }
                }

                ArrayPushArray(g__ArrayWeapons, ArrayWeaponData);
                json_free(JSON_WeaponArray);
            }
        }

        json_free(JSON_WeaponObject);
    }

    json_free(JSON_Handle);

    server_print("ArraySize: %i", ArraySize(g__ArrayWeapons));
}
Можно закрывать тему.
 
Сообщения
1
Реакции
0
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
как обычно: героически родил проблему на ровном месте и героически сам ее решил. Вангую, что неудачно в итоге, так как
new JSON: JSON_WeaponObject = Invalid_JSON;
new JSON: JSON_WeaponArray = Invalid_JSON;
new JSON: JSON_AbilityOjbect = Invalid_JSON;
new JSON: JSON_Cost = Invalid_JSON;
new JSON: JSON_Value = Invalid_JSON;
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
cancer, можно форточку открыть? Просто всё по факту. И просто душно вдруг стало.
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
434
Реакции
296
Помог
5 раз(а)
wilianm, слишком много операций с файловой системой. Зачем при каждом обращении к какому-либо полю внутри файла снова читать этот файл с диска?
4 Апр 2024
ImmortalAmxx, прокачку оружия делаешь?)

Я бы старался избегать использования обьектов как массивов:
JSON:
{
    "weapon_deagle": {
        "name": "Deagle"
    },
    "weapon_famas": {
        "name": "Famas"
    },
}
->
JSON:
{
    "weapons": [
        {
            "weapon": "weapon_deagle",
            "name": "Deagle"
        },
        {
            "weapon": "weapon_famas",
            "name": "Famas"
        }
    ]
}
Да, это получается чуть более громоздко, но звучит правильнее.
4 Апр 2024
И, если я правильно понял, что cost и value связаны между собой, то такая структура звучит не очень хорошо... Зачем разделять их, если они должны быть друг с другом:
JSON:
{
    "name": "AK-47",
    "clip": {
        "cost": [1, 2, 3],
        "value": [1, 2, 3]
    }
}
->
JSON:
{
    "name": "AK-47",
    "clip": [
        {
            "cost": 1,
            "value": 1
        },
        {
            "cost": 2,
            "value": 2
        },
        {
            "cost": 3,
            "value": 3
        }
    ]
}
Тут получается ещё более многословно, зато связанные значения не разбросаны по отдельным массивам)
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
ArKaNeMaN, и твой конфиг размазался на тысячу строк ) я бы оставил вариант тс, просто потому что пофиг и это павн )
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
434
Реакции
296
Помог
5 раз(а)

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу