将复杂Javascript变量作为JSON发送将返回400个错误
我有以下设置 在客户端,我使用了一个复杂的Javascript变量将复杂Javascript变量作为JSON发送将返回400个错误,javascript,c#,jquery,json,json.net,Javascript,C#,Jquery,Json,Json.net,我有以下设置 在客户端,我使用了一个复杂的Javascript变量 var order = { name:"", id:"", cost:"", details:{ sItem:[{name:"",cost:""}], dItem:[{name:"",cost:"", components:[{name:
var order = {
name:"",
id:"",
cost:"",
details:{
sItem:[{name:"",cost:""}],
dItem:[{name:"",cost:"", components:[{name:"",quantity:""}]}]
}
}
我在服务器上有一个c语言的控制器,就像这样
public string getCost(string order)
{
var sOrder = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(order);
//do the processing here
return "I am processed";
}
问题是当我发送这个请求时,服务器会以错误的请求响应,但是如果我附加一个简单的字符串,比如“hello”,而不是JSON.stringify(order)。控制器接收到它并成功返回,没有问题,因此我知道问题出在将订单转换为JSON的过程中,但不知道如何找到答案
是的,我正在使用getJSON并返回一个简单的字符串,但这不是问题,因为我将在处理完成后返回一个JSON字符串。实际上,在某些属性值发生更改的情况下,接收到的JSON将是相同的。我使用了$.get、$.post、$.getJSON等。当我让其中一些对象工作时,它们总是返回jqXHR,即使响应是序列化的JSON对象。 以下是我成功的唯一途径。(请注意,我正在访问一个web服务。)
$(文档).ready(函数(){
$.ajax({
url:“WebService1.asmx/GetAList”,
//数据:JSON.stringify({s:parms}),
键入:“post”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(数据、状态){
var contries=JSON.parse(data.d);
$(“#sel2”)。选择2({data:contries});
},
错误:函数(一,二){
调试器;
}
});
});
从ajax填充
和我的网络服务
使用System.Web.Script.Services
namespace WebApplication1
{ // a class in context with how the data are is being used
[Serializable]
public class select2Item
{
public String id { get; set; }
public String text { get; set; }
public select2Item(String code, String name)
{
this.id = code;
this.text = name;
}
public select2Item() { }
}
/// <summary>
/// Summary description for WebService1
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string GetAList()
{
System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
return makelist();
}
// return a list of serialized codes and countries
public String makelist()
{
List<select2Item> list = new List<select2Item>();
list.Add(new select2Item("AI", "Anguilla"));
list.Add(new select2Item("AQ", "Antarctica"));
list.Add(new select2Item("AG", "Antigua and Barbuda"));
list.Add(new select2Item("AR", "Argentina"));
list.Add(new select2Item("AM", "Armenia"));
list.Add(new select2Item("AW", "Aruba"));
list.Add(new select2Item("AU", "Australia"));
list.Add(new select2Item("AT", "Austria"));
list.Add(new select2Item("AZ", "Azerbaijan"));
list.Add(new select2Item("BS", "Bahamas"));
list.Add(new select2Item("BH", "Bahrain"));
list.Add(new select2Item("BD", "Bangladesh"));
list.Add(new select2Item("BB", "Barbados"));
list.Add(new select2Item("BY", "Belarus"));
list.Add(new select2Item("BE", "Belgium"));
list.Add(new select2Item("BZ", "Belize"));
// did it this way to show you which to use
System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
String jsonList = ser.Serialize(list);
return jsonList;
}
}
}
命名空间WebApplication1
{//上下文中的一个类,说明如何使用数据
[可序列化]
公共类select2Item
{
公共字符串id{get;set;}
公共字符串文本{get;set;}
public select2Item(字符串代码、字符串名称)
{
this.id=代码;
this.text=名称;
}
public select2Item(){}
}
///
///WebService 1的摘要说明
///
[WebService(命名空间=”http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
公共类WebService 1:System.Web.Services.WebService
{
[网络方法]
公共字符串GetAList()
{
System.Web.Script.Serialization.JavaScriptSerializer ser=new System.Web.Script.Serialization.JavaScriptSerializer();
返回makelist();
}
//返回序列化代码和国家/地区的列表
公共字符串生成列表()
{
列表=新列表();
添加(新选择2项(“AI”、“安圭拉”);
添加(新选择2项(“AQ”、“南极洲”);
添加(新选择2项(“AG”、“安提瓜和巴布达”);
添加(新选择2项(“AR”、“阿根廷”);
添加(新选择2项(“AM”、“亚美尼亚”);
添加(新的select2Item(“AW”、“Aruba”);
列表。添加(新的select2Item(“AU”、“Australia”);
添加(新的select2Item(“AT”,“Austria”);
添加(新的select2Item(“AZ”、“阿塞拜疆”);
添加(新选择2项(“BS”、“巴哈马”);
添加(新选择2项(“BH”、“巴林”);
添加(新选择2项(“BD”、“孟加拉”);
添加(新选择2项(“BB”、“巴巴多斯”);
添加(新的select2Item(“BY”,“白俄罗斯”));
添加(新选择2项(“BE”、“比利时”);
添加(新的select2Item(“BZ”、“伯利兹”);
//这样做是为了告诉你该用哪个
System.Web.Script.Serialization.JavaScriptSerializer ser=new System.Web.Script.Serialization.JavaScriptSerializer();
字符串jsonList=ser.Serialize(列表);
返回jsonList;
}
}
}
您不想发送id而不是完整的json吗?您不能通过URL发送json,某些字符可能不受支持。在某些情况下,嵌套结构中的项目没有Id,因此我需要发送所有order对象。此外,如果服务器端和客户端只需要处理一个公共对象,部分由客户端填充,部分由服务器填充,那么这将使服务器端和客户端都变得容易;这是假设一个ID。如果你确实需要发送数据,做一个POST请求,而不是传递到URL。哦,是的,我已经纠正了它。你是说调用postJSON而不是getJSON吗?或者其他我希望下面的帖子能帮助你。
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
url: "WebService1.asmx/GetAList",
// data: JSON.stringify({ s: parms }),
type: 'post',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data, status) {
var contries = JSON.parse(data.d);
$("#sel2").select2({ data: contries });
},
error: function (one, two) {
debugger;
}
});
});
</script>
</head>
<body>
<form>
<div>
<p>populated from ajax</p>
<select style="width:175px" id="sel2"></select>
</div>
</form>
</body>
</html>
namespace WebApplication1
{ // a class in context with how the data are is being used
[Serializable]
public class select2Item
{
public String id { get; set; }
public String text { get; set; }
public select2Item(String code, String name)
{
this.id = code;
this.text = name;
}
public select2Item() { }
}
/// <summary>
/// Summary description for WebService1
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string GetAList()
{
System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
return makelist();
}
// return a list of serialized codes and countries
public String makelist()
{
List<select2Item> list = new List<select2Item>();
list.Add(new select2Item("AI", "Anguilla"));
list.Add(new select2Item("AQ", "Antarctica"));
list.Add(new select2Item("AG", "Antigua and Barbuda"));
list.Add(new select2Item("AR", "Argentina"));
list.Add(new select2Item("AM", "Armenia"));
list.Add(new select2Item("AW", "Aruba"));
list.Add(new select2Item("AU", "Australia"));
list.Add(new select2Item("AT", "Austria"));
list.Add(new select2Item("AZ", "Azerbaijan"));
list.Add(new select2Item("BS", "Bahamas"));
list.Add(new select2Item("BH", "Bahrain"));
list.Add(new select2Item("BD", "Bangladesh"));
list.Add(new select2Item("BB", "Barbados"));
list.Add(new select2Item("BY", "Belarus"));
list.Add(new select2Item("BE", "Belgium"));
list.Add(new select2Item("BZ", "Belize"));
// did it this way to show you which to use
System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
String jsonList = ser.Serialize(list);
return jsonList;
}
}
}