Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> JSON encode "true" zamiast true
topcio
post 9.12.2022, 18:15:55
Post #1





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


Hej

Czy ktoś może mi pomóc dlaczego w wyniku json_encode dosateje

  1. "zmienna_1": "true",


zamiast

  1. "zmienna_1": true,


dobra sorry już znalazłem odpowiedź

wystarczyło dodać do zmiennej (bool)

smile.gif

Nie mniej to nie rozwiązuje mojego problemu, ponieważ dla wartości innych niż true/false również konwertuje mi do bool a tak nie ma być sad.gif
Go to the top of the page
+Quote Post
trueblue
post 9.12.2022, 18:20:49
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Skoro spodziewasz się, że zmienna będzie miała wartość boolean, to zrób po prostu:
Kod
zmienna = zmienna == 'true';


--------------------
Go to the top of the page
+Quote Post
topcio
post 9.12.2022, 18:59:34
Post #3





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


No właśnie nie wiem tego, bo wysyłam setki zmiennych POST, jedne są bool, inne tekst a inne liczbowe. Nie wiem jak to ogarnąć.

Zrobiłem coś takiego

  1. if ($input == "true" || $input == "false") {
  2. (bool)$input;
  3. }
  4. if (is_numeric($input)) {
  5. settype($input, "integer");
  6. }


Czy tak może być?

Niestety to nie działa sad.gif
Go to the top of the page
+Quote Post
trueblue
post 9.12.2022, 19:14:38
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A co niby dzieje się w linii 2?


--------------------
Go to the top of the page
+Quote Post
topcio
post 9.12.2022, 21:53:23
Post #5





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


Dobra mój błą

Tak miało być
  1. if (is_numeric($input)) {
  2. settype($input, "integer");
  3. }
  4. if ($input === "true" || $input === "false") {
  5. $input = (bool)$input;
  6. }


teraz jest OK smile.gif
Zmęczenie bierze tongue.gif

Trochę pomęczyłem i wyszło coś takiego

  1. $config_file = file_get_contents($file);
  2. $decoded_data = json_decode($config_file, true);
  3. foreach ($_POST as $POST_key => $POST_value) {
  4. if ($POST_key != "submit" && $POST_key != "ID") {
  5. $POST_key_right = substr($POST_key, strpos($POST_key, "=") + 1);
  6. $POST_key_left = strtok($POST_key, '=');
  7. if (!is_array($POST_value)) {
  8. if ($POST_key_left == "Hunt_") {
  9. foreach($decoded_data as $Primary_Key => $Primary_Val) {
  10. foreach($Primary_Val as $Secondary_Key => $Secondary_Val ) {
  11. if ($Secondary_Key === "Hunt_") {
  12. foreach($Secondary_Val as $Third_Key => $Third_Val ) {
  13. if ($Third_Key == $POST_key_right) {
  14. if ($POST_value == "true") {
  15. $decoded_data[$Primary_Key][$Secondary_Key][$Third_Key] = true;
  16. }
  17. else if ($POST_value == "false") {
  18. $decoded_data[$Primary_Key][$Secondary_Key][$Third_Key] = false;
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. else {
  27. foreach($decoded_data as $Primary_Key => $Primary_Val) {
  28. foreach($Primary_Val as $Secondary_Key => $Secondary_Val ) {
  29. if ($Secondary_Key == $POST_key) {
  30. if (is_numeric($POST_value)) {
  31. settype($POST_value, "integer");
  32. $decoded_data[$Primary_Key][$Secondary_Key] = $POST_value;
  33. }
  34. else if ($POST_value == "true") {
  35. $decoded_data[$Primary_Key][$Secondary_Key] = true;
  36. }
  37. else if ($POST_value == "false") {
  38. $decoded_data[$Primary_Key][$Secondary_Key] = false;
  39. }
  40. else {
  41. $decoded_data[$Primary_Key][$Secondary_Key] = $POST_value;
  42. }
  43. }
  44. }
  45. }
  46. }
  47. }
  48. if (is_array($POST_value)) {
  49. echo "TABLICA - ";
  50. echo $POST_key_left, " - ", $POST_value, "<BR>";
  51. }
  52. }
  53. $enc_data = json_encode($decoded_data, JSON_PRETTY_PRINT, JSON_NUMERIC_CHECK);
  54. file_put_contents($file, $enc_data);


Sugestie mile widziane, jeszcze dane w postaci tablic, może dam radę smile.gif

Ten post edytował topcio 9.12.2022, 21:55:29
Go to the top of the page
+Quote Post
Tomplus
post 10.12.2022, 13:27:03
Post #6





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Odpowiadając na pierwszy post, skoro używasz json_encode, to przy

[php]$foo = ['a'=>1, 'b'=>true, 'c'=>false, 'd' => new stdClass, 'e'=>'stop'];
$json = json_encode($foo);
print($json);
var_dump(json_decode($json, true));/php]

to wynikiem są:

Kod
{"a":1,"b":true,"c":false,"d":{},"e":"stop"}
array(5) {
  ["a"]=>
  int(1)
  ["b"]=>
  bool(true)
  ["c"]=>
  bool(false)
  ["d"]=>
  array(0) {
  }
  ["e"]=>
  string(4) "stop"
}


klucz o wartości b i c podają wartości bool, a nie string.

Do sprawdzenia wartości przychodzących z _POST lub _GET lepiej użyć: filter_var($foo['b'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Szczególnie, że rozpatruje także pozytywnie wartości 'on', '1' jako true, a czasem przy wysyłaniu do skryptu wartości przez JS mogą być wysłane właśnie takie wartości dla prawdy lub fałszy np. z formularza radio lub checkbox.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 00:36