Problem bei erstellung eines Mehrdimensionales Json Array

  • PHP

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von virus.

    Problem bei erstellung eines Mehrdimensionales Json Array

    Einen wunderschönen guten Tag und ein Frohes neues Jahr ! :)

    Ich habe nen Problem bei der erstellung eines mehr Mehrdimensionales Json Array, ich lege mal los und kopiere mal nen wenig Text und Code hier rein .. :P


    Das wäre der PHP Code wie ich meine Json erstelle.
    Spoiler anzeigen

    PHP-Quellcode

    1. $sql = "SELECT * FROM `keys` INNER JOIN `data_keys` ON `data_keys`.id = `keys`.id WHERE `kundennummer`='$kundennummer' OR `rechnungsnummer`='$rechnungsnummer' ;";
    2. $result = mysqli_query($conn, $sql);
    3. while($row = mysqli_fetch_assoc($result)){
    4. $array2[] = $row;
    5. }
    6. foreach($array2 as $row){
    7. $new_array[$row['id']] = Array($row['id'], $row['hash']);
    8. $new_array[$row['id']]['hash'] = $row['hash'];
    9. $new_array[$row['id']]['kundennummer'] = $row['kundennummer'];
    10. $new_array[$row['id']]['rechnungsnummer'] = $row['rechnungsnummer'];
    11. $new_array[$row['id']]['windows_7'] = $row['windows_7'];
    12. $new_array[$row['id']]['windows_10'] = $row['windows_10'];
    13. $new_array[$row['id']]['keys'][] = Array('key' =>$row['key'],'type' =>$row['type']);
    14. }
    15. header('Content-Type: application/json');
    16. echo json_encode($new_array);


    Ausgabe Json
    Spoiler anzeigen

    XML-Quellcode

    1. {
    2. "14": {
    3. "id": "14",
    4. "hash": "1958E516",
    5. "kundennummer": "1",
    6. "rechnungsnummer": "2",
    7. "windows_7": "1",
    8. "windows_10": "1",
    9. "keys": [
    10. {
    11. "key": "1111-1111-1111-1111",
    12. "type": "1"
    13. },
    14. {
    15. "key": "2222-2222-2222-2222",
    16. "type": "2"
    17. }
    18. ]
    19. },
    20. "15": {
    21. "id": "15",
    22. "hash": "51515EE2",
    23. "kundennummer": "2",
    24. "rechnungsnummer": "3",
    25. "windows_7": "1",
    26. "windows_10": "1",
    27. "keys": [
    28. {
    29. "key": "3333-3333",
    30. "type": "2"
    31. },
    32. {
    33. "key": "4444-4444-4444",
    34. "type": "3"
    35. }
    36. ]
    37. }
    38. }



    Das Problem ist einfach das ich so die Json nicht in meinem Programm auslesen kann, da vor jedem "Json Array" die jeweilige ID steht, wenn diese ID nicht steht geht es ohne Probleme.

    PHP-Quellcode

    1. $new_array[$row['id']]
    Hier weise ich ja die ID dem Array zu, wenn ich dies aber nicht mache dann bekomme ich auch wenn die Datenbankabfrage
    mehr ausspruckt nur ein Eintrag in der Json ausgabe.


    Das Problem ist ganz klar bei der erstellung, und verarbeitung, ich bin eben nicht so der PHP Fachmann, deshalb frag ich doch hier einfach mal nach was ich dort ändern könnte bzw verbessern könnte.


    Bei weiteren Fragen stehe ich gerne zur verfügung, und bedanke mich jetzt schon mal recht Herzlich bei euch :)
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)
    Das blöde ist wenn ich das jetzt so mache dann bekomme ich 4 Ausgaben. Jeweils zweimal den Kunden mit jeweils eine der zugewiesenen Seriennummer. Das Problem habe ich bei meiner alten Ausgabe nicht ?(
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)
    wie liest du das json ein?

    Über json_decode(<json-string>) versucht PHP aus dem JSON ein Objekt zu basteln.
    Wenn du ein assoziatives Array daraus haben möchtest, verwende json_decode(<json-string>, true)

    LG, Acr0most

    Edit: für den Fall, dass du deine Id nicht setzt, und er deinen Eintrag überschreibt:
    anstatt

    PHP-Quellcode

    1. $arr[<stelle>] = "a";
    2. $arr[<stelle>] = "b";


    verwende

    PHP-Quellcode

    1. $arr[<stelle>][] = "a";
    2. $arr[<stelle>][] = "b";
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Eingelesen wird das über ein VB.net Programm

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub btn_on_Click(sender As Object, e As EventArgs) Handles btn_on.Click
    2. Dim Json = JsonConvert.DeserializeObject(Of List(Of JsonObject))(<PFAD>)
    3. End Sub
    4. Public Class JsonObject
    5. <JsonProperty("id")>
    6. Public Property ID As Integer
    7. <JsonProperty("hash")>
    8. Public Property Hash As String
    9. <JsonProperty("kundennummer")>
    10. Public Property Kundennummer As String
    11. <JsonProperty("rechnungsnummer")>
    12. Public Property Rechnungsnummer As String
    13. <JsonProperty("windows_7")>
    14. Public Property Windows_7 As String
    15. <JsonProperty("windows_10")>
    16. Public Property Windows_10 As String
    17. <JsonProperty("keys")>
    18. Public Property keys As String()()
    19. End Class



    Spoiler anzeigen

    XML-Quellcode

    1. [
    2. {
    3. "id": "14",
    4. "hash": "1958E516",
    5. "kundennummer": "1",
    6. "rechnungsnummer": "2",
    7. "windows_7": "1",
    8. "windows_10": "1",
    9. "keys": [
    10. [
    11. "0000-000",
    12. "1"
    13. ],
    14. [
    15. "1111-1111-1111-1111",
    16. "1"
    17. ],
    18. [
    19. "2222-2222-2222-2222",
    20. "2"
    21. ]
    22. ]
    23. },
    24. {
    25. "id": "15",
    26. "hash": "51515EE2",
    27. "kundennummer": "2",
    28. "rechnungsnummer": "3",
    29. "windows_7": "1",
    30. "windows_10": "1",
    31. "keys": [
    32. [
    33. "3333-3333",
    34. "2"
    35. ],
    36. [
    37. "4444-4444-4444",
    38. "3"
    39. ]
    40. ]
    41. }
    42. ]

    Diesen String kann ich wiederum bei mir einlesen ohne Probleme.

    Den String aus dem ersten Post geht nicht, und wirft folgende Fehlermeldung..
    Spoiler anzeigen

    Quellcode

    1. Ein Ausnahmefehler des Typs "Newtonsoft.Json.JsonSerializationException" ist in Newtonsoft.Json.dll aufgetreten.
    2. Zusätzliche Informationen: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Geny.frmMain+JsonObject]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
    3. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
    4. Path '14', line 1, position 9.
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)
    Versuch es mal so:

    PHP-Quellcode

    1. $sql = ...
    2. $result = mysqli_query($conn, $sql);
    3. $json = array();
    4. while($row = mysqli_fetch_assoc($result)) {
    5. $id = $row['id'];
    6. if(!isset($json[$id])) {
    7. $json[$id] = array(
    8. 'id' => $row['id'],
    9. 'hash' => $row['hash'],
    10. 'kundennummer' => $row['kundennummer'],
    11. 'rechnungsnummer' => $row['rechnungsnummer'],
    12. 'windows_7' => $row['windows_7'],
    13. 'windows_10' => $row['windows_10'],
    14. 'keys' => array()
    15. );
    16. }
    17. $json[$id]['keys'][] = array($row['key'], $row['type']);
    18. }
    19. header('Content-Type: application/json');
    20. echo json_encode(array_values($json));


    PS: Falls $kundennummer und $rechnungsnummer von außen (= dein VB-Programm) an das PHP-Skript übergeben werden, solltest du Prepared Statements verwenden.
    (Oder die Parameter in PHP zumindest richtig validieren, falls das nicht schon passieren sollte)
    Guten Abend,
    sorry das ich mich jetzt erst melde... hatte zu viel zu tun :D.

    Nun aber muss ich mich erst mal bedanken, denn genau so soll es funktionieren :o.
    Ich muss mich einfach mal etwas mehr mit php beschäftigen, kann anscheinend nie schaden :).
    Mit den "Prepared Statements" werd ich mich nochmal einlesen, da ich wie gesagt in dem Bereich php noch nicht so das Wissen habe.


    Vielen Dank nochmals :) !
    Marvin
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)