【问题标题】:Saving JSON data to database将 JSON 数据保存到数据库
【发布时间】:2013-04-06 16:28:44
【问题描述】:

拿起了 knockout.js,我正在尝试使用 PHP(更具体地说是 Laravel 框架)将数据保存到 mysql 数据库中。这是ajax:

$.ajax("save", {
  data: ko.toJSON(this), // turns the input into JSON I assume?
  type: "post",
  success: function() {
    alert("Success!");  // right now I'm alerting the data to troubleshoot
  }
});

以及我将数据保存到数据库中的方法:

// I expect my ajax to send me data that is in json format
// I then decode the data to get an array which I can use to run my query
$data = json_decode(Input::json(), true);
return DB::table('content')->insert($data);

但是,问题是我似乎正在接收对象类型的数据(在$data 上运行gettype() 并且json_decode() 也返回了错误),准确地说是stdClass Object。在对我的 javascript 中发生的事情进行故障排除后,我提醒了数据,它是 JSON 格式,所以它必须工作。

我确实让它像这样工作:

$data = json_encode(Input::json(), true);
return DB::table('content')->insert(json_decode($data), true);

这很成功,保存到数据库等。但是我很困惑。请原谅我对 JSON 的缺乏经验,但过程不应该是:

  • 在前端将数据编码为 JSON
  • 向服务器发送数据
  • 在后端解码数据,将其转换为服务器可以处理的格式(本例中为数组)
  • 插入数据

所以,在我的第一次尝试中,$data = Input::json() 是对象类型。 Json_decode 抛出一个错误,因为它需要一个字符串,现在我有点迷路了,因为我需要 JSON。

【问题讨论】:

  • 我不知道 Laravel 但我认为您需要将 JSON contentType 设置添加到您的 ajax 调用中。所以试试$.ajax("save", { data: ko.toJSON(this), // turns the input into JSON I assume? contentType: "application/json", type: "post", success: function() { alert("Success!"); // right now I'm alerting the data to troubleshoot } });
  • @nemesv 试过了,不走运。仍在接收对象。
  • @ejx 也许Input::json()已经解码了json字符串?否则只需var_dump()it,这样您就可以检查它包含的内容。

标签: javascript knockout.js laravel json


【解决方案1】:

当你使用Input::json() 时,Laravel 会自动将 JSON 解码为一个对象供你使用。在大多数情况下,您希望对提交的 JSON 进行一些处理,并且通常不会将其存储为 JSON,而是存储在数据库行的单独列中。

如果您使用的是 Laravel 3,则可以改为使用以下行来获取原始(未解码)JSON:

$raw = Request::foundation()->getContent();

在 Laravel 4 中,我相信它是:

$raw = Input::getContent();

或者,如果您希望将 JSON 解码为数组,您可以在 Laravel 3 中使用以下内容...

$array = Input::json(true);

Laravel 4 中没有等效的 as-array。

【讨论】:

  • 是的! Request::foundation()->getContent(); 完美运行,世界再次变得有意义!我确实找到了使用 get_object_vars() 的解决方法,但您的回答使用我拥有的工具解决了问题,因此您的回答“回答”了我的问题。
【解决方案2】:

所以,我找到了解决此问题的方法。显然Input::json()返回对象类型的数据,PHP的通用对象,正常为空。所有数据都存储在该对象中,剩下要做的就是将该对象转换为数组。 get_object_vars() 确实做到了,结果将是一个格式良好的数组,这就是有效的:

$data = get_object_vars(Input::json()); // will return an array, exactly what I need
return DB::table('tableName')->insert($data); // Data can be inserted now properly

【讨论】:

    【解决方案3】:

    如果您尝试将淘汰视图模型作为 json 传输,您将无法直接将视图模型转换为 json。原因是视图模型中的所有字段实际上都不是这样的字段:

    var viewmodel = {
        name: 'Bob',
        age: 23
    };
    

    相反,这些字段是淘汰的 observables:

    var viewmodel = {
        name: ko.observable('Bob'),
        age: ko.observable(23)
    };
    

    你实际上需要调用每个 observable 来获取它的当前值。显然,这可能很乏味,但有一个映射插件可以为您完成这件事——Knockout mapping plugin

    使用映射插件,您可以简单地做到:

    ko.mapping.toJSON(viewmodel)
    

    它会返回一个json字符串,将viewmodel表示为一个普通的js对象。

    【讨论】:

    • 这不会解决 OP 的问题,因为 ko.toJSON 会处理 observables 并返回正确的 JSON。请参阅:jsfiddle.net/9mHVm 所以在这种情况下这不是问题。
    • 我什至没有注意到他使用了 ko.toJSON。哎呀!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2020-12-17
    • 2012-04-05
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多