![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Mam dane json, przykładowo:
Zapisuje je do bazy MySQL, do pola typu json. I po zapisie w polu mam wartość:
Jak widać przy zapisie dane zostały znormalizowane - posortowane wg. klucza. Czy da się to jakoś wyłączyć tak aby kolejność kluczy z oryginalnego json została zachowana również w polu tabeli MySQL? Powyższy json to tylko przykład, w rzeczywistości danych jest więcej i są dynamiczne (różne wartości i kolejności). Dane mają wyświetlane dokładnie wg. tej kolejności jak mam w oryginale - posortowanie przy zapisie to uniemożliwia. Ten post edytował jol.us_ 18.10.2017, 11:55:48 -------------------- run Forest run ...
|
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
obiektu json NIE posortujesz (mam na mysli ze nie jestes w stanie ustawic wlasnej kolejnosci). Oswoj sie z ta mysla. Jedyne nad czym jestes w stanie zapanowac to numeryczna tablica JSON numerowana od 0 w gore. Kazde inne indeksy to wartosci losowe jesli chodzi o kolejnosc.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Właśnie mi chodzi o to aby nie były sortowane i zostały zapisane w oryginalnej formie - a MySQL mi je sortuje sam z siebie wg alfabetu.
Funkcja PHP json_encode zamienia tablice na json wg kolejnosci podania zmiennych. Czy nie ma szans by MySQL też zapisał jsona bez normalizowania - czyli tak jak mu go podaje podczas zapisu? Ten post edytował jol.us_ 18.10.2017, 12:29:07 -------------------- run Forest run ...
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Właśnie mi chodzi o to aby nie były sortowane i zostały zapisane w oryginalnej formie - a MySQL mi je sortuje sam z siebie wg alfabetu Przeciez ci napisalem: nie idzie ustawic wlasnej kolejnosci indeksow w JSON. NIE i koniec kropka. Jedyna kolejnosc jaka mozna ustawic to dla tablicy numerowanej od 0 - i tyle.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Zapisz jako tekst (przykładowo mariadb i tak json aliasuje do longtext).
-------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@viking ale wowczas przy decode i tak dostanie zmieniona kolejnosc. Moze nie za pierwszym razem, moze nie za drugim, ale w koncu dostanie.
Powinien/powinna stworzyc normalny system wyswietlania a nie polegajacy na tej sztucznej kolejnosci. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
No to bryndza
![]() Liczyłem, że może da sie to jakoś wyłączyć w konfiguracji bd. Tablice numerowane mnie nie urządzają bo potem nie będę się mógł do nich odwoływać przez json_extract(pole, '$.klucz') Dane są dynamiczne, za każdym razem inne, jedynie nazwy kluczy maja znaczenie. Jakiś pomysł jak sobie z tym poradzić inaczej? Nie wierze, że tylko ja z tym mam problem. Może jako osobny obiekt json dawać kolejność, na zasadzie:
Zapisz jako tekst (przykładowo mariadb i tak json aliasuje do longtext). Tak miałem pierwotnie. I wszystko pięknie działa. Problem mam jednak z wyszukiwaniem. W polach typu json mogę szukać w określonych kluczach, w polu tekstowych już nie. @viking ale wowczas przy decode i tak dostanie zmieniona kolejnosc. Moze nie za pierwszym razem, moze nie za drugim, ale w koncu dostanie. Hmm... nie spotkałem się. Zawsze dekoduje mi w tej samej kolejności co ma w obiekcie. Ten post edytował jol.us_ 18.10.2017, 12:55:41 -------------------- run Forest run ...
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Nie wierze,
Tez mialem z tym problem. Rozwiazanie banalne: przestalem polegac na kolejnosci w JSON ![]() Cytat Zawsze dekoduje mi w tej samej kolejności co ma w obiekcie. Mi tez kiedys kolejnosc ciagle sie zgadzala. Az tu nagle po pol roku sie okazalo, ze mam rzeczy przemieszane. Takze nie, dziekuje ![]() No i jak wrzucisz to jak ci proponowal viking to stracisz mozliwosci operacji na obiekcie JSON w bd a widze, ze uzywasz operacji jak json_extract -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Tak jak proponował @viking już mam. Właśnie chciałem przejść na typ json - ale ta kolejność wszystko mi niweczy.
Generalnie zmiana na klucze numeryczne, gdy mam już wszystko prawie gotowe to będzie właściwie cofnięcie się do początku. U mnie numeryczne klucze się nie sprawdzą. Muszę znaleźć inny sposób. Ten post edytował jol.us_ 18.10.2017, 12:57:55 -------------------- run Forest run ...
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Czy oryginalna kolejność oznacza, że raz możesz mieć JSON taki:
a innym razem taki:
, czyli pomimo identycznej zawartości może zdarzyć się inna kolejność? -------------------- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Czy oryginalna kolejność oznacza, że raz możesz mieć JSON taki:
a innym razem taki:
, czyli pomimo identycznej zawartości może zdarzyć się inna kolejność? Json'y które zacytowałeś to moja dalsza modyfikacja - próba wymyślenia jak przechowywać kolejność bez kluczy numerycznych. W pierwszym poście jest przedstawiony problem. Mam json który ma jakąś kolejność danych, jednak po zapisie do bd (do pola typu json) jest on automatycznie porządkowany i kolejność jest zmieniana - mnie zależy na zachowaniu pierwotnej kolejności. No ale jak już wyszło - tego się uniknąć nie da. Wciąż nie wymyśliłem jak to zrobić. Mój finalny Json może mieć wiele zagnieżdżeń, które również mają mieć zachowaną kolejność. Chyba jednak w tym przypadku pozostanę przy tekstowym przechowywaniu danych. Ten post edytował jol.us_ 19.10.2017, 08:17:06 -------------------- run Forest run ...
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
No, ale nie odpowiedziałeś na pytanie.
Czy dany klucz raz może być w JSON w indeksie X, a w innym przypadku w indeksie Y. Mówimy o oryginalnym JSON, przed włożeniem do bazy danych. -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Generalnie klucze nie są z góry zdefiniowane. Ich kolejność za każdym razem może być inna - cała właśnie zasada działania jest w tym.
Potem kolejność wyświetlania na stronie jest taka sama jak kolejność kluczy. Obecnie, w uproszczeniu, działa to tak. Zapis 1. Mam formularz z różnymi polami, które są sortowane przez użytkownika (wraz z zagnieżdżeniami). 2. Wysyłam formularz, a tablice POST traktuje funkcja json_encode i zapisuję do bazy danych - do pola format longtext. Edycja 1. Odczytuje jsona z bazy danych 2. Parsuje jsona i na jego podstawie generuje formularz edycji w tej samej kolejności i z tymi samymi zagnieżdżeniami Do tej pory wszystko działało jak należy. Jednak teraz pojawiła się potrzeba przeszukiwania mojego json po niektórych kluczach - noi tutaj stwierdziłem, że najlepiej będzie jak zmienię typ pola na json i użyje sobie m. in. funkcji json_extract. Jednak okazało się, że zapisując dane do typu pola json (zamiast do longtext) mysql normalizuje dane i sortuje je wg klucza (alfabetycznie) - przez co niweczy mi całe generowanie formularza edycji. Ten post edytował jol.us_ 19.10.2017, 10:18:11 -------------------- run Forest run ...
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Ok, czyli każdy JSON traktujemy odrębnie, nawet jeśli klucze będą podobne - nie ma ogólnej zasady pozycji kluczy.
W takim razie obok pola z JSON możesz zapisywać drugi JSON, w którym klucze będą identyczne jak w pierwszym, ale wartościami będą oryginalne indeksy kluczy. Czyli np. dla:
drugi JSON będzie taki:
Kiedy je zapiszesz w bazie, to w pierwszym przypadku stracisz kolejność, ale z drugiego JSON (nawet po przemieszaniu) uzyskasz informacje, na której pozycji był klucz. Drugi JSON uzyskasz w PHP z wykorzystaniem rekurencji, array_keys i array_flip. -------------------- |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Tak, też zacząłem tak kombinować. Trzymać gdzieś json z kolejnością.
Ale klucze numeryczne muszę nadawać. Do tego dane się zagnieżdżają co mi komplikuje sprawę -------------------- run Forest run ...
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
W jakim momencie potrzeba Ci tak kolejność? Gdzie ją "wyciągasz"?
-------------------- |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. W formularzu edycji - generując formularz danych w tej samej kolejności
2. Wyświetlając na froncie dane w tej samej kolejności -------------------- run Forest run ...
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
W takim razie możesz przechowywać oryginalną kopię JSON w polu TEXT (bez CAST'owania na JSON przy wyciąganiu danych) na podstawie, której uzyskasz informacje o kolejności.
Jeśli jednak się zdecydujesz na powyższe rozwiązanie, to tak jak pisałem, używasz rekurencji - wtedy nie będzie problemu z zagnieżdżonymi danymi. -------------------- |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 10.12.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Trzymanie 2 razy danych to mało eleganckie.
Wiem, że trzymanie kolejności to jedyne wyjście. Będę się musiał z tym zmierzyć. -------------------- run Forest run ...
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Zawsze możesz wybierać wszystkie rekordy, a warunek dla JSON umieścić już po stronie skryptu. Ale czy to będzie bardzie eleganckie? Czasem redundancji danych nie da się uniknąć.
Czekaj czekaj. Jeśli dobrze zrozumiałem, to jest tak jak wyżej. Czyli JSON_EXTRACT używasz w WHERE, tak? W takim razie przechowuj JSON w polu TEXT, a dla potrzeb WHERE i JSON_EXTRACT użyj CAST na tym polu. Wyselekcjonujesz odpowiednie rekordy, a JSON nadal będzie w oryginalnej postaci. Jeśli mój tok rozumowania jest niepoprawny, to wyjaśnij proszę w jakim celu na poziomie zapytania używasz JSON_EXTRACT. Ten post edytował trueblue 19.10.2017, 10:52:54 -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 18:37 |