【问题标题】:PHP JSON Array encoding for use with JSOUP Android用于 JSOUP Android 的 PHP JSON 数组编码
【发布时间】:2015-04-18 03:37:49
【问题描述】:

我正在尝试构建一个目录数据库,该数据库将与 Android 应用程序交互,以便在扫描条形码时进行查看。应用程序应该询问 MySQL 数据库并查询与零件相关的各种项目。 MySQL 部分的代码在这里:

<?php
if(isset($_POST['submit']) || isset($_POST['catalog'])) {
    require("connect_to_mysql.php");
    header("content-type: application/json");

    $tables_result = mysql_query("SHOW TABLES") or die(mysql_error());

    while ($table = mysql_fetch_row($tables_result)) {
        $query_results = mysql_query("SELECT * FROM ".$table[0]." WHERE catalog = '".$_POST['catalog']."'") or die(mysql_error());
        if (mysql_num_rows($query_results) > 0) {
            $fields = mysql_query("SHOW COLUMNS FROM ".$table[0]);

            while ($res = mysql_fetch_array($fields)) {
                $names[] = $res[0];
            }

            $comments = mysql_fetch_row(mysql_query("SELECT table_comment FROM INFORMATION_SCHEMA.TABLES WHERE table_name='".$table[0]."'")) or die(mysql_error());

            while($array = mysql_fetch_array($query_results)){
                $rows["part"] = $comments[0];
                $rows["fields"] = $names;
                for($i = 0; $i < mysql_num_fields($query_results); $i++){
                    $rows[$names[$i]] = $array[$i];
                }
                echo json_encode($rows);
            }
        }
    }
    mysql_free_result($tables_result); 
}
if(!isset($_POST['submit']) || !isset($_POST['catalog'])) {
    echo "
    <form method='post'>
    <input type='text' name='catalog' />
    <input type='submit' name='submit' />
    </form>
    ";
}
?>

但是,例如,这样做的结果是:

{"part":"Lospa Tibial Baseplate","fields":["catalog","size"],"catalog":"01.10.50B","size":"11"}

我在 Android 客户端使用 JSOUP,它具有返回 JSONArray 的功能。我过去使用它时的 JSONArray 看起来像这样(我遇到问题的 JSON 部分是“字段”对象):

{"part":"Lospa Tibial Baseplate","fields":{["catalog","size"]},"catalog":"01.10.50B","size":"11"}

在对字段数组进行编码之前,我尝试直接对数组进行编码,但没有成功,并返回了一堆斜杠和无用的东西:

{"part":"Lospa Tibial Baseplate","fields":"[\"catalog\",\"size\"]","catalog":"01.10.50B","size":"11"}

我应该采取的最佳方法是什么?我宁愿不只是将两个括号硬编码到那里,但如果这是最后一个选项,请告诉我如何做到这一点,因为我不能只是 $rows["fields"] = "{".$names."}";

【问题讨论】:

  • 尝试对循环中的每个项目进行编码总是一个坏主意,总是先在 PHP 中构建完整的数组结构,然后在完成之后再进行编码
  • JSOUP 真的更喜欢"fields":{["catalog","size"]}?

标签: php mysql arrays json


【解决方案1】:

在构建完成后尝试对结构进行编码:

if(isset($_POST['submit']) || isset($_POST['catalog'])) {
    require("connect_to_mysql.php");
    header("content-type: application/json");

    $tables_result = mysql_query("SHOW TABLES") or die(mysql_error());

    while ($table = mysql_fetch_row($tables_result)) {
        $query_results = mysql_query("SELECT * FROM ".$table[0]." WHERE catalog = '".$_POST['catalog']."'") or die(mysql_error());
        if (mysql_num_rows($query_results) > 0) {
            $fields = mysql_query("SHOW COLUMNS FROM ".$table[0]);

            while ($res = mysql_fetch_array($fields)) {
                $names[] = $res[0];
            }

            $comments = mysql_fetch_row(mysql_query("SELECT table_comment FROM INFORMATION_SCHEMA.TABLES WHERE table_name='".$table[0]."'")) or die(mysql_error());

            while($array = mysql_fetch_array($query_results)){
                $rows["part"] = $comments[0];
                $rows["fields"] = $names;
                for($i = 0; $i < mysql_num_fields($query_results); $i++){
                    $rows[$names[$i]] = $array[$i];
                }
            }

            // JSON encode at the end
            echo json_encode($rows);
        }
    }
    mysql_free_result($tables_result); 
}

顺便说一句,这是无效的 JSON:

{"fields":{["catalog","size"]},"catalog":"01.10.50B","size":"11"}

如果fields 必须是一个对象,则应该更像这样。

{"fields":{"key":["catalog","size"]},"catalog":"01.10.50B","size":"11"}

所以最好检查一下你的 JSOUP 解析是否设置正确。

【讨论】:

    【解决方案2】:

    我想通了。下面是我的代码。我基本上必须制作一组编码的 JSON 对象。感谢金指出正确的方向。我还对函数进行了一些更改,但这对它的 JSON 部分没有影响。

    <?php
    if(isset($_POST['catalog'])) {
        require("connect_to_mysql.php");
        header("content-type: application/json");
    
    $tables_result = mysql_query("SHOW TABLES") or die(mysql_error());
    while ($table = mysql_fetch_row($tables_result)) {
        $query_results = mysql_query("SELECT * FROM ".$table[0]." WHERE catalog = '".$_POST['catalog']."'") or die(mysql_error());
        if (mysql_num_rows($query_results) > 0) {
    
    
            $comments = mysql_fetch_row(mysql_query("SELECT table_comment FROM INFORMATION_SCHEMA.TABLES WHERE table_name='".$table[0]."'")) or die(mysql_error());
            $columns_sql = mysql_query("SELECT COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_NAME = '".$table[0]."'") or die(mysql_error());
            $rows["validity"] = true;
            $rows["part"] = $comments[0];
    
            while ($res = mysql_fetch_array($columns_sql)) {
                $names[] = $res[0];
            }
            $rows["fields_count"] = count($names);
    
            while($array = mysql_fetch_array($query_results)){
    
                for($i = 0; $i < mysql_num_fields($query_results); $i++){
                    $values[] = array($names[$i] => $array[$i]);
                }
            }
            $rows["fields"] = $values;
            echo json_encode($rows);
            exit();
        }
    }
    echo '{"validity":false}';
    mysql_free_result($tables_result); 
    }
    ?>
    

    【讨论】:

      【解决方案3】:

      字段结构不正确...

      这就是我使用Simple JSON for PHP 库的原因!它可以避免对我们的 JSON 进行硬编码。

      使用$Json-&gt;addContent(new arrayJson("fields",$values)); 会将您的json 的fields 字段设置为您的值。它应该是这样的:

      <?php
      include('includes/json.php');
      
      $Json = new json();
      if(isset($_POST['catalog'])) {
          require("connect_to_mysql.php");
          header("content-type: application/json");
      
      $tables_result = mysql_query("SHOW TABLES") or die(mysql_error());
      while ($table = mysql_fetch_row($tables_result)) {
          $query_results = mysql_query("SELECT * FROM ".$table[0]." WHERE catalog = '".$_POST['catalog']."'") or die(mysql_error());
          if (mysql_num_rows($query_results) > 0) {
      
              $comments = mysql_fetch_row(mysql_query("SELECT table_comment FROM INFORMATION_SCHEMA.TABLES WHERE table_name='".$table[0]."'")) or die(mysql_error());
              $columns_sql = mysql_query("SELECT COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_NAME = '".$table[0]."'") or die(mysql_error());
      
              $Json->addContent(new propertyJson('status', '200'));
              $Json->addContent(new propertyJson('validity', true));
              $Json->addContent(new propertyJson('part', $comments[0]));
      
              while ($res = mysql_fetch_array($columns_sql)) {
                  $names[] = $res[0];
              }
              $Json->addContent(new propertyJson('count', count($names))); = 
      
              while($array = mysql_fetch_array($query_results)){
      
                  for($i = 0; $i < mysql_num_fields($query_results); $i++){
                      $values[] = array($names[$i] => $array[$i]);
                  }
              }
      
              $Json->addContent(new arrayJson("fields",$values));
              json_send($Json);
              exit();
          }
      }
      $Json->addContent(new propertyJson('status', '200'));
      $Json->addContent(new propertyJson('message', 'Validity failed'));
      json_send($Json);
      mysql_free_result($tables_result); 
      }
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多