Jak przekonwertować ciąg JSON na tablicę

123

To, co chcę zrobić, to:

  1. biorąc JSON jako dane wejściowe z obszaru tekstowego w php
  2. użyj tego wejścia i przekonwertuj go na JSON i przekaż do php curl, aby wysłać żądanie.

to m uzyskuje php z get of api ten ciąg json chcę przekazać do json, ale nie jest konwertowany na tablicę

echo $str='{
        action : "create",
        record: {
            type: "n$product",
            fields: {
                n$name: "Bread",
                n$price: 2.11
            },
            namespaces: { "my.demo": "n" }
        }
    }';
    $json = json_decode($str, true);

powyższy kod nie zwraca mi tablicy.

X Men
źródło
1
Czy musisz przekonwertować ciąg json na tablicę, czy chcesz sfałszować adres URL z tych danych? O co właściwie chodzi?
Janis Veinbergs
then it is not givingNie dając czego? Pobierasz ciąg w formacie JSON z obszaru tekstowego i konwertujesz go na JSON ???
PeeHaa,
1
jeśli wykonasz powyższe json w moim pytaniu json_decode (, prawda), czy to ponownie dostraja tablicę
XMen
@Pekka Sprawdź ponownie mój quesiton.
XMen
3
to był problem z nieprawidłowym plikiem JSON.
XMen

Odpowiedzi:

187

Jeśli przekażesz JSON w swoim poście do json_decode, zakończy się niepowodzeniem. Prawidłowe ciągi JSON mają klucze w cudzysłowach:

json_decode('{foo:"bar"}');         // this fails
json_decode('{"foo":"bar"}', true); // returns array("foo" => "bar")
json_decode('{"foo":"bar"}');       // returns an object, not an array.
RickN
źródło
jeśli wykonasz powyższe json w moim pytaniu json_decode (, prawda), czy to ponownie dostraja tablicę
XMen
@RahulMehta Jeśli używasz wbudowanego języka PHP, json_decode()zwróci on informację, NULLże kod JSON jest nieprawidłowy (na przykład brak kluczy w cudzysłowie). Tak mówi dokumentacja i to zwraca moja instalacja PHP 5.2. Czy używasz funkcji innej niż oficjalna, wbudowana json_decode()? Co var_dump(json_decode($str, true));wraca?
RickN
po json_encoding chciałbym odczytać każdy pojedynczy obiekt json, np. {foo: "bar"} jako obiekt w tablicy. jak mogę utworzyć tablicę z danych json_encoded, aby odczytać każdy obiekt json? @RikkusRukkus
Manny265
@ Manny265 to brzmi jak coś, co zasługuje na własne pytanie z (1) przykładowym kodem, (2) tym, co do tej pory wypróbowałeś i (3) oczekiwanym wynikiem, a nie sekcją komentarzy.
RickN
99

Spróbuj tego:

$data = json_decode($your_json_string, TRUE);

Drugi parametr sprawi, że zdekodowany łańcuch json stanie się tablicami asocjacyjnymi.

sepidol
źródło
30

Jeśli otrzymujesz ciąg JSON z formy korzystania $_REQUEST, $_GETalbo $_POSTbędzie trzeba użyć funkcji html_entity_decode(). Nie zdawałem sobie z tego sprawy, dopóki nie zrobiłem var_dumptego, co było w żądaniu, w porównaniu z tym, co skopiowałem do i echooświadczenie, i zauważyłem, że ciąg żądania był znacznie większy.

Właściwa droga:

$jsonText = $_REQUEST['myJSON'];
$decodedText = html_entity_decode($jsonText);
$myArray = json_decode($decodedText, true);

Z błędami:

$jsonText = $_REQUEST['myJSON'];
$myArray = json_decode($jsonText, true);
echo json_last_error(); //Returns 4 - Syntax error;
jbeauchamp
źródło
2
Doskonale, to działa. kiedy otrzymam dane z funkcji _POST $ json_last_error () było = do JSON_ERROR_SYNTAX. ale zawsze było dobrze. Był to błąd dekodowania, a nie błąd kodowania, taki jak ascii lub utf8. DZIĘKI
11

Użyj json_decode($json_string, TRUE)funkcji, aby przekonwertować obiekt JSON na tablicę.

Przykład:

$json_string   = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

$my_array_data = json_decode($json_string, TRUE);

UWAGA: Drugi parametr przekształci zdekodowany ciąg JSON w tablicę asocjacyjną.

===========

Wynik:

var_dump($my_array_data);

array(5) {

    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}
Arslan Ramay
źródło
6

Jeśli otrzymujesz ciąg json z adresu URL za pomocą file_get_contents, wykonaj następujące kroki:

$url = "http://localhost/rest/users";  //The url from where you are getting the contents
$response = (file_get_contents($url)); //Converting in json string
 $n = strpos($response, "[");
$response = substr_replace($response,"",0,$n+1);
$response = substr_replace($response, "" , -1,1);
print_r(json_decode($response,true));
pijusz
źródło
6

Twój ciąg powinien mieć następujący format:

$str = '{"action": "create","record": {"type": "n$product","fields": {"n$name": "Bread","n$price": 2.11},"namespaces": { "my.demo": "n" }}}';
$array = json_decode($str, true);

echo "<pre>";
print_r($array);

Wynik:

Array
 (
    [action] => create
    [record] => Array
        (
            [type] => n$product
            [fields] => Array
                (
                    [n$name] => Bread
                    [n$price] => 2.11
                )

            [namespaces] => Array
                (
                    [my.demo] => n
                )

        )

)
Dinanath Thakur
źródło
2

Możesz przekonwertować obiekt json na Array & String.

$data='{"resultList":[{"id":"1839","displayName":"Analytics","subLine":""},{"id":"1015","displayName":"Automation","subLine":""},{"id":"1084","displayName":"Aviation","subLine":""},{"id":"554","displayName":"Apparel","subLine":""},{"id":"875","displayName":"Aerospace","subLine":""},{"id":"1990","displayName":"Account Reconciliation","subLine":""},{"id":"3657","displayName":"Android","subLine":""},{"id":"1262","displayName":"Apache","subLine":""},{"id":"1440","displayName":"Acting","subLine":""},{"id":"710","displayName":"Aircraft","subLine":""},{"id":"12187","displayName":"AAC","subLine":""}, {"id":"20365","displayName":"AAT","subLine":""}, {"id":"7849","displayName":"AAP","subLine":""}, {"id":"20511","displayName":"AACR2","subLine":""}, {"id":"28585","displayName":"AASHTO","subLine":""}, {"id":"45191","displayName":"AAMS","subLine":""}]}';

$b=json_decode($data);

$i=0;
while($b->{'resultList'}[$i])
{
    print_r($b->{'resultList'}[$i]->{'displayName'});
    echo "<br />";
    $i++;
}
Manav Akela
źródło
1

Jeśli kiedykolwiek będziesz musiał przekonwertować plik lub struktury JSON na tablice w stylu PHP, ze wszystkimi poziomami zagnieżdżenia, możesz użyć tej funkcji. Najpierw musisz json_decode ($ yourJSONdata), a następnie przekazać go do tej funkcji. Wyświetli w oknie przeglądarki (lub konsoli) prawidłowe tablice w stylu PHP.

https://github.com/mobsted/jsontophparray

Denis Volkov
źródło
1
<?php
$str='{
    "action" : "create",
    "record" : {
                "type": "$product",
                "fields": {
                           "name": "Bread",
                           "price": "2.11"
                           },
                "namespaces": { "my.demo": "n" }
                }
    }';
echo $str;
echo "<br>";
$jsonstr = json_decode($str, true);
print_r($jsonstr);

?>

Myślę, że to powinno działać, po prostu klucze powinny być również w podwójnych cudzysłowach, jeśli nie są cyframi.

Pradeep Dhawan
źródło
1

to moje rozwiązanie: ciąg json $columns_validation = string(1736) "[{"colId":"N_ni","hide":true,"aggFunc":null,"width":136,"pivotIndex":null,"pinned":null,"rowGroupIndex":null},{"colId":"J_2_fait","hide":true,"aggFunc":null,"width":67,"pivotIndex":null,"pinned":null,"rowGroupIndex":null}]"

więc używam json_decode dwa razy w ten sposób:

$js_column_validation = json_decode($columns_validation);
$js_column_validation = json_decode($js_column_validation); 

var_dump($js_column_validation);

a wynik to:

 array(15) { [0]=> object(stdClass)#23 (7) { ["colId"]=> string(4) "N_ni" ["hide"]=> bool(true) ["aggFunc"]=> NULL ["width"]=> int(136) ["pivotIndex"]=> NULL ["pinned"]=> NULL ["rowGroupIndex"]=> NULL } [1]=> object(stdClass)#2130 (7) { ["colId"]=> string(8) "J_2_fait" ["hide"]=> bool(true) ["aggFunc"]=> NULL ["width"]=> int(67) ["pivotIndex"]=> NULL ["pinned"]=> NULL ["rowGroupIndex"]=> NULL }
Mourad MAMASSI
źródło
Dziękuję brachu ... uratowałeś mi dzień
Nuwan Withanage
1

Upewnij się, że ciąg ma następujący format JSON, który wygląda mniej więcej tak:

{"result":"success","testid":"1"} (with " ") .

Jeśli nie, możesz dodać parametry "responsetype => json"żądania.

Następnie użyj, json_decode($response,true)aby przekonwertować go na tablicę.

unpokkolokko
źródło
1
Witamy w StackOverflow :-) Społeczność jest zawsze zadowolona z nowych członków, którzy chcą wnieść w nią swój wkład i docenia Twoje podejście. Niestety inny członek uznał, że Twoja odpowiedź zasługuje na negatywną opinię. Być może dlatego, że samo pytanie zostało zadane około siedem lat temu i już kilkakrotnie udzielono na nie odpowiedzi. Ponadto responseTypewłaściwość służy do określenia rodzaju danych w odpowiedzi na zapytanie. Problem polega jednak na tym, że treść żądania zawiera dane, które same w sobie nie znajdują się w prawidłowym pliku. Twoja odpowiedź nie pasuje zatem do podanego kontekstu.
Philipp Maurer
1

Możesz zmienić ciąg na JSON w następujący sposób, a także możesz przyciąć, rozebrać ciąg, jeśli chcesz,

$str     = '[{"id":1, "value":"Comfort Stretch"}]';
//here is JSON object
$filters = json_decode($str);

foreach($filters as $obj){
   $filter_id[] = $obj->id;
}

//here is your array from that JSON
$filter_id;
Shahrukh Anwar
źródło
0

Użyj tego konwertera, to wcale nie zawodzi: Services_Json

// create a new instance of Services_JSON
$json = new Services_JSON();

// convert a complexe value to JSON notation, and send it to the browser
$value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
$output = $json->encode($value);
print($output);
// prints: ["foo","bar",[1,2,"baz"],[3,[4]]]

// accept incoming POST data, assumed to be in JSON notation
$input = file_get_contents('php://input', 1000000);
$value = $json->decode($input);

// if you want to convert json to php arrays:
$json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
Farhad Sakhaei
źródło
-2
$data = json_encode($result, true);

echo $data;
Viktor
źródło
2
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
rollstuhlfahrer