Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ PHP _ JSON encode "true" zamiast true

Napisany przez: topcio 9.12.2022, 18:15:55

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

Napisany przez: trueblue 9.12.2022, 18:20:49

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

Kod
zmienna = zmienna == 'true';

Napisany przez: topcio 9.12.2022, 18:59:34

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 (http://www.php.net/is_numeric($input)) {
  5. http://www.php.net/settype($input, "integer");
  6. }


Czy tak może być?

Niestety to nie działa sad.gif

Napisany przez: trueblue 9.12.2022, 19:14:38

A co niby dzieje się w linii 2?

Napisany przez: topcio 9.12.2022, 21:53:23

Dobra mój błą

Tak miało być

  1. if (http://www.php.net/is_numeric($input)) {
  2. http://www.php.net/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 = http://www.php.net/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 = http://www.php.net/substr($POST_key, http://www.php.net/strpos($POST_key, "=") + 1);
  6. $POST_key_left = http://www.php.net/strtok($POST_key, '=');
  7. if (!http://www.php.net/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 (http://www.php.net/is_numeric($POST_value)) {
  31. http://www.php.net/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 (http://www.php.net/is_array($POST_value)) {
  49. http://www.php.net/echo "TABLICA - ";
  50. http://www.php.net/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

Napisany przez: Tomplus 10.12.2022, 13:27:03

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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)