Javascript 将JSON数据保存到数据库

Javascript 将JSON数据保存到数据库,javascript,knockout.js,laravel,json,Javascript,Knockout.js,Laravel,Json,拿起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 tro

拿起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
上的run
gettype()
json\u decode()
返回了一个错误),
stdClass对象
。在对javascript中发生的问题进行故障排除后,我向数据发出了警报,数据是JSON格式的,因此必须正常工作

我确实让它工作了,不过是这样:

$data = json_encode(Input::json(), true);
return DB::table('content')->insert(json_decode($data), true);
var viewmodel = {
    name: 'Bob',
    age: 23
};
这工作成功,保存到数据库等,但我感到困惑。请原谅我对JSON缺乏经验,但过程不应该是:

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

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

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

$data = json_encode(Input::json(), true);
return DB::table('content')->insert(json_decode($data), true);
var viewmodel = {
    name: 'Bob',
    age: 23
};
相反,这些字段是可忽略的可观察项:

var viewmodel = {
    name: ko.observable('Bob'),
    age: ko.observable(23)
};
实际上,您需要调用每个可观察对象以获取其当前值。显然,这可能会很乏味,但是有一个映射插件可以为您实现这一点——映射

使用映射插件,您只需执行以下操作:

ko.mapping.toJSON(viewmodel)

它将返回一个json字符串,该字符串将viewmodel表示为常规js对象。

因此,我找到了一个解决方案。显然,
Input::json()
返回对象类型的数据,PHP的通用对象,通常为空。所有数据都存储在该对象中,唯一要做的就是将该对象转换为数组
get\u object\u 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

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

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

在Laravel 4中,我认为:

$raw = Input::getContent();
或者,如果您希望将JSON解码为数组,您可以在Laravel3中使用以下命令

$array = Input::json(true);

Laravel 4中没有as数组等价物。

我不知道
Laravel
,但我认为您需要在ajax调用中添加JSON
contentType
设置。因此,尝试使用
$.ajax(“save”、{data:ko.toJSON(this),//将输入转换为我假设的JSON?contentType:“application/JSON”、type:“post”、success:function(){alert(“success!”);//现在我正在提醒数据进行疑难解答})@nemesv试过了,运气不好。仍在接收对象。@ejx是否可能已解码json字符串?否则只需
var\u dump()
it,这样您就可以检查它包含的内容。这不会解决OP的问题,因为
ko.toJSON
将处理可观察对象并返回正确的JSON。请看:所以这不是本例中的问题。我甚至没有注意到他使用了ko.toJSON。哎呀!对!<代码>请求::基础()->getContent()工作完美,世界再次变得有意义!我确实使用
get\u object\u vars()
找到了一个解决方法,但您的答案使用了我的工具解决了问题,因此您的答案“回答”了我的问题。