以正确的格式将数据保存到JSON文件 - PHP

时间:2017-01-25 22:34:18

标签: javascript php ajax

我目前通过使用以下代码将点击坐标保存到JSON文件:

onmouseup = function(e){
  var Clicks = {};
  Clicks.state = {
    cX: e.clientX,
    cY: e.clientY,
  }
  $.ajax({
    type : "GET",
    url : "PHP/save_json.php",
    data : {
      state : JSON.stringify(Clicks.state)
    }
  });
}

<?php
$myFile = "JSON/clicks.json";
$fh = fopen($myFile, 'a') or die("can't open file");
$stringData = $_GET["state"];
fwrite($fh, $stringData);
fclose($fh)
?>

但是使用上面的代码我会以下列不正确的格式保存坐标:

{ “CX”:467, “CY”:374} { “CX”:56, “CY”:474}

任何人都可以帮我保存JSON数组中的坐标而不是单独的JSON条目吗?

我希望文件如下,将坐标添加到文件中已存在的JSON数组中:

{ 
   "ID":["1","2"],
   "cX":["467","56"],
   "cY":["374","474"]
}

4 个答案:

答案 0 :(得分:1)

您需要将数据加载到数组,添加新数据并保存回文件。

我认为你不需要在字符串中保存数字。 如果不存在,这些代码会创建新文件。

<?php
// test input data
if(isset($_GET['state']['cX']) && 
   isset($_GET['state']['cY']) && 
   is_numeric($_GET['state']['cX']) && 
   is_numeric($_GET['state']['cY']) ) 
{
    // ok
} else {
   exit('Bad data format');
}

$myFile = __DIR__ . "/JSON/clicks.json";

// step 1, load data from file to array
$array = file_exists($myFile) ? 
    json_decode(file_get_contents($myFile), true) : 
    [];

// step 2, add data to array
$array['ID'][] = isset($array['ID']) ? (count($array['ID']) + 1) : 1;
$array['cX'][] = (int) $state['cX'];
$array['cY'][] = (int) $state['cY'];

// step 3, save array back to file
file_put_contents($myFile, json_encode($array));

或者你可以使用其他文件格式来附加文件。静态结构化数据的最简单格式可以是CSV

答案 1 :(得分:1)

您需要做的是:

  • 打开 clicks.json 文件并阅读全部内容。
  • 使用stdClass将其转换为json_decode的实例。这将为您提供一个PHP对象,您可以使用普通的PHP函数和语法进行修改。
  • 在您从客户端收到的JSON上使用json_decode
  • 使用array_push将新值从客户端推送到存储在文件中的数组(类似array_push($fileJson->cX, $clientJson->cX);
  • 使用json_encode再次对$fileJson进行编码。
  • 将其写回文件。

这假设 clicks.json 文件已经使用已创建的数组等正确格式化了JSON。

答案 2 :(得分:1)

鉴于keyvalue位的当前排列,很明显JSON数据在写入文件之前需要进行某种转换。这种转变完成的地方绝对是一个意见问题。但是,假设您在PHP中收到以下JSON数据:

[{"cX":467,"cY":374},{"cX":56,"cY":474}]

PHP代码可以写成(用静态输入说明):

$myFile = "JSON/clicks.json";
$fh = fopen($myFile, 'a') or die("can't open file");
$stringData = $_GET["state"];
$json_array_source  =   json_decode($string, true);

$json_array_target  =   array();
foreach($json_array_source as $key=>$value){
    $json_array_target["ID"][]  =   $key + 1;
    foreach($value as $sub_key => $sub_value){
        $json_array_target[$sub_key][]  =   $sub_value;
    }
}

$transformed_string = json_encode($json_array_target);
fwrite($fh, $transformed_string);
fclose($fh);

如果你去echo $transformed_string;,你会看到:

{"ID":[1,2],"cX":[467,56],"cY":[374,474]}

将写入文件的内容。

答案 3 :(得分:-1)

使用json_encode将字符串转换为对象,然后使用json_decode和JSON_PRETTY_PRINT选项将其转换回字符串。

$stringData = json_decode(json_encode($_GET["state"]), JSON_PRETTY_PRINT);

http://php.net/manual/en/function.json-encode.php