Jak odczytać dane przesłane w formacie JSON w JavaScript?

1

Witam. Z kontrolera otrzymuję wynik w formacie JSON

{
     "h10"="true",
     "h11"="false",
     itp. aż do h21
}

Potrzebuję teraz ustawić atrybut "disabled" dla określonych checkboxów, aby były zgodne z przyjętymi danymi

$.ajax({
                    url: '@Url.Action("CheckAvailableReservationHours", "Reservations")',
                    type: 'POST',
                    data: {
                        "FullNameWithEmail": owner,
                        "RoomId": roomId,
                        "Date": reservationDate
                    },
                    success: function (response) {
                        alert(response);
                        var obj = JSON.parse(response);

                        for (var i = 10; i <= 21; i++) {
                            var owner = document.getElementById("h" + i);
                            owner.setAttribute("disabled", obj.);
                        }
                            
                    },
                    failure: function (response) {
                        alert("failure");
                    },
                    error: function (response) {
                        alert("error");
                    }
                });

W jaki sposób w owner.setAttribute("disabled", obj.); przekazać wartość kryjącą się pod kluczem? Nie wiem jak sięodnieść np. do obj.h10, to jest poprawne? programuję w c# i ciężko mi to pojąć

3

Przede wszystkim to nie jest format JSON. JSON by wyglądał tak:

{
     "h10": "true",
     "h11": "false",
     itp. aż do h21
}

Poza tym jak odpowiednio ustawisz jQuery to zrobi z tego obiekt automagicznie (albo nawet robi to z automatu jak dostanie content-type jako application/json, nie wiem, dawno w tym nie pisałem). A jak już masz obiekt to obj.h10 powinien wystarczyć.

0

a iterując od 10 do 21 jak odczytać dane z obiektu od "h10" do "h21"? Da się?

0
Grzegorz Świdwa napisał(a):

a iterując od 10 do 21 jak odczytać dane z obiektu od "h10" do "h21"? Da się?

Wciśnij F12 w przeglądarce i zobacz, co Ci przyszło w zwrotce. Wszystko się da, JS ma równie duże możliwości, co C#.

0

Ogólnie z C# konwertuję Dictionary<string, bool> do JSONA

public async Task<string> CheckAvailableReservationHours(string FullNameWithEmail, Guid RoomId, string Date)
        {
            ApplicationUser user = _dbContext.Users.FirstOrDefault(x => x.FirstName + " " + x.LastName + " (" + x.Email + ")" == FullNameWithEmail.ToString());
            if (user == null)
                throw new Exception("Nie znaleziono użytkownika");
            Room room = _dbContext.Rooms.FirstOrDefault(x => x.ID == RoomId);
            DateTime date = DateTime.Parse(Date).Date;
            var value = (await _reservationService.GetAvailableReservationHours(user, room, date)).Select(x => new KeyValuePair<string, bool>("h" + x.Key.ToString(), x.Value));
            return JsonConvert.SerializeObject(value);
        }

Otrzymuję taką zwrotkę:
screenshot-20201028214436.png

Mam CheckBoxy:

 @for (int n = 0; n < Model.SelectedHours.Count(); n++)
                {
                    <div id="@Model.SelectedHours[n].DivID" class="form-control">
                        <input id="@Model.SelectedHours[n].Id" asp-for="@Model.SelectedHours[n].Checked" class="text-danger" onchange="SelectedHourChanged(this)" /> @Model.SelectedHours[n].Name
                    </div>

                }
Model.SelectedHours = new List<HourVisual>()
                {
                    new HourVisual(){Id="h10", Name="10:00 - 10:55", DivID="d10"},
                    new HourVisual(){Id="h11", Name="11:00 - 11:55", DivID="d11"},
                    new HourVisual(){Id="h12", Name="12:00 - 12:55", DivID="d12"},
                    new HourVisual(){Id="h13", Name="13:00 - 13:55", DivID="d13"},
                    new HourVisual(){Id="h14", Name="14:00 - 14:55", DivID="d14"},
                    new HourVisual(){Id="h15", Name="15:00 - 15:55", DivID="d15"},
                    new HourVisual(){Id="h16", Name="16:00 - 16:55", DivID="d16"},
                    new HourVisual(){Id="h17", Name="17:00 - 17:55", DivID="d17"},
                    new HourVisual(){Id="h18", Name="18:00 - 18:55", DivID="d18"},
                    new HourVisual(){Id="h19", Name="19:00 - 19:55", DivID="d19"},
                    new HourVisual(){Id="h20", Name="20:00 - 20:55", DivID="d20"},
                    new HourVisual(){Id="h21", Name="21:00 - 21:55", DivID="d21"},
                };

I muszę teraz je oznaczyć jako aktywne lub nieaktywne na podstawie tych danych.

Chodzi mi głównie o podstawy JavaScript. mając liczbę musze się odwołać do obiektu litera + liczba czyli np.
n = 10;
Odwołuję się do litery h + n, czyli h10. Nie wiem jak w javaScript rozwiązać ten problem. W c# bym po prostu się odniósł obj["h10"], czyli

for(int n=10; n<=21; n++)
     Console.WriteLine(obj["h" + n.ToString()])
2
let data = {
    "h10": true,
    "h11": false,
    "h12": true,
    "h13": false,
    "h14": false,
    "h15": true,
    "h16": false,
    "h17": false,
    "h18": false,
    "h19": true,
    "h20": true,
    "h21": false
}

console.log('all')
for (const dataKey in data) {
    console.log(`${dataKey} = ${data[dataKey]}`);
}


console.log('')
console.log('even')
for (let i = 10; i < 22; i = i + 2) {
    let key = `h${i}`
    console.log(key, '=', data[key]);
}

console.log('')
console.log('odd')
for (let i = 11; i < 22; i = i + 2) {
    let key = `h${i}`
    console.log(key, '=', data[key]);
}

node json.js 
all
h10 = true
h11 = false
h12 = true
h13 = false
h14 = false
h15 = true
h16 = false
h17 = false
h18 = false
h19 = true
h20 = true
h21 = false

even
h10 = true
h12 = true
h14 = false
h16 = false
h18 = false
h20 = true

odd
h11 = false
h13 = false
h15 = true
h17 = false
h19 = true
h21 = false
0

Możesz przybliżyć mi pod jakim hasłem szukać w google wyjaśnienia tego? h${i} Wydaje mi się, że robi to co potrzebuję a przyda mi się znajomość tego w dalszym etapie :)

2

Template Literals
https://developers.google.com/web/updates/2015/01/ES6-Template-Strings

Mam nadzieję, że nie pomyliłem nazwy. Przyznam, nie pamiętałem. Po prostu te same "wsteczne" pojedyncze cudzysłowy i Dolar z Wąsaczami

Te same, które w bash odpowiadają za " 'wykonanie' zawartości'", jak $()

root@54030069146d:/# echo `date`
Wed Oct 28 21:01:39 UTC 2020
root@54030069146d:/# echo $(date)
Wed Oct 28 21:01:47 UTC 2020

Przy okazji, jak się uczysz i masz nockę z kodowaniem, to masz do kompletu uzupełniający bonus z cudzysłowami ;)

root@54030069146d:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@54030069146d:/# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@54030069146d:/# echo '$PATH'
$PATH

Programista Linuksa używać nie musi, ale podstawy powinien znać ;)
Na tym koniec ewangelizacji - już będę grzeczny :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1