我想从json文件中提取数据,然后将其发布到服务器端。
这种数据解除工作:
$.post('/createDBJSON',{'name':'bar'},
function(data) {window.alert(data);}
但是我需要这样的东西:
$.post('/createDBJSON',{'/assets/appconf/db.json'},
function(data) {window.alert(data);}
我知道$ .post将数据作为PlainObject或String获取,但我想以某种方式将数据发布为json文件,因为我的json文件非常复杂(嵌入式键值对太多),可以轻松地解析为js变量$ .getJSON用于$ .post中的文件。
为了实现这个目的,我还应该考虑另一种方法吗?
提前谢谢。
答案 0 :(得分:2)
您可以像这样使用$ .getJSON:
$.getJSON('/assets/appconf/db.json', function(json) {
$.post('/createDBJSON',json,
function(data) {window.alert(data);}
});
答案 1 :(得分:1)
我认为当数据是对象时,您可能会遇到$.post()
的微妙问题。它被转换为字符串,但不转换为JSON字符串 - 而是用作构建application/x-www-form-urlencoded
字符串的一组键值对。
$.post()
的另一个问题是它始终发送application/x-www-form-urlencoded; charset=UTF-8
的内容类型标头。这可能是服务器崩溃的原因:它期望JSON,但内容类型是application/x-www-form-urlencoded
。要解决此问题,我们可以使用更通用的$.ajax()
,它有更多选项。
试试这个:
$.getJSON('/assets/appconf/db_trial.json', function(firstData)
{
$.ajax({
type: "POST",
url: '/createDBJSON',
data: JSON.stringify(firstData), // send JSON representation
contentType: 'application/json; charset=utf-8', // set correct content-type header
success: function(secondData) {window.alert(secondData);}
});
});
我们还可以尝试另一种方法,它永远不会将第一个json响应转换为一个对象,然后再转换为一个json字符串,而只是将其作为文本保持整个时间:
$.ajax({
dataType: "text", // parse response only as text
url: '/assets/appconf/db_trial.json',
success: function(jsonString) {
$.ajax({
type: "POST",
url: '/createDBJSON',
data: jsonString, // jsonString is already a json string
contentType: 'application/json; charset=utf-8', // set correct content-type header
success: function(secondData) {window.alert(secondData);}
});
}
});
请同时试试!
但我仍然建议修复你的后端,以便数据不会无缘无故地通过客户端!我认为Play Framework 2包含用于JSON操作的Jackson,因此您只需要导入正确的类,并搜索互联网以了解如何使用Jackson库读取JSON文件。
答案 2 :(得分:1)
原来我的内容类型不是json。需要指定。 Play 2.1 json body parse示例的工作原理如下。我希望他们也提供适当的客户呼叫示例......
这是工作的ajax调用:
$.getJSON('/assets/appconf/db_trial.json', function(json)
{
$.ajax({
url:'/createDBJSON',
type:"POST",
data:JSON.stringify(json),
contentType:"application/json; charset=utf-8",
dataType:"json",
success: function(){
}
});
});