使用 Web API 控制器解析传入的 JSON(来自 javascript Ajax post)
Parse incoming JSON (from javascript Ajax post) using Web API controller
我有以下脚本
<script>
$(window).load(function () {
var model = [
{
"reservation":
{
"ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
"clubId": 70656,
"courtNumber": 1,
"crud_name": "add",
"reservationtype_name": "toernooi"
}
},
{
"reservation":
{
"ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
"clubId": 70656,
"courtNumber": 1,
"crud_name": "update",
"reservationtype_name": "toernooi"
}
}
];
alert(JSON.stringify(model));
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "http://localhost:59854/api/incomingapi",
contentType: "application/json",
dataType: 'json',
success: function (result) { },
error: function (errResult) { }
});
});
</script>
我有以下控制器
public string Post(HttpRequestMessage request)
{
string jsonString1 = request.Content.ReadAsStringAsync().Result;
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
var v1 = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
var v2 = json_serializer.DeserializeObject(jsonString1);
JObject jobj1 = JObject.Parse("{ \"test\":\"some data\" }");
JObject jobj2 = JObject.Parse(jsonString1);
return "";
}
v1
和jobj1
用于测试。 jsonString1
填充了值。 v2
在运行时用值填充。
然而我只有这4种方法
- 等于()
- GetHashCode()
- GetType()
- ToString()
在我输入代码时可用...
我必须将 jsonString1
中的值转换为保留类型的集合或某种方式,然后我可以循环或使用 linq,但是当我尝试类似的操作时,值没有得到已填充(一切为空或 0)。
例如,下面我可以循环并使用 linq,但未填充值(是 0 和 0 而不是 70656 和 1):
var parsedVar = json_serializer.Deserialize<ICollection<ReservationModelForJson>>(jsonString1);
var clubId = parsedVar.First().clubId;//is 0 should be 70656
var courtNumber = parsedVar.First().courtNumber;//is 0 should be 1
谁能解决这个问题?非常感谢!
public class ReservationModelForJson
{
public string ticketId { get; set; }
public int clubId { get; set; }
public int courtNumber { get; set; }
public string crud_name { get; set; }
public string reservationtype_name { get; set; }
}
ANSWER/SOLUTION:
我在下面添加了class
public class JsonBinder
{
public ReservationModelForJson reservation { get; set; }
}
并将我的控制器更改为
public string Post(IEnumerable<JsonBinder> reservations)
{
int clubId = reservations.First().reservation.clubId;
int courtNumber = reservations.First().reservation.courtNumber;
return "tnkx!";
}
试试这个:
json_serializer.Deserialize<List<ReservationModelForJson>>(jsonString1);
并且您的 courtNumber
等属性位于 reservation
对象中,因此例如您应该使用 parsedVar.First().courtNumber;
。 ReservationModelForJson
的结构在这种情况下很重要。
这应该有效。不要使用 Post 方法中的 HttpRequestMessage 参数,而是使用 ReservationModelForJson 的集合。此外,您可能需要删除 JSON.stringify(model),然后只传递模型。
public string Post(IEnumerable<ReservationModelForJson> reservations)
{
//Now you can work with the reservations collection
var firstRes = reservations.FirstOrDefault();
}
这是因为你的反序列化失败了。您尝试在服务器端反序列化的内容与您的 json 模型不匹配。目前您正在尝试反序列化具有 属性 名称保留的对象列表(这是具有预期属性的对象)。要修复,请像下面那样改造您的 json。
var model = [
{
"ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
"clubId": 70656,
"courtNumber": 1,
"crud_name": "add",
"reservationtype_name": "toernooi"
},
{
"ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
"clubId": 70656,
"courtNumber": 1,
"crud_name": "update",
"reservationtype_name": "toernooi"
}
];
或者创建一个 class 对象 属性 具有预期属性、ticketId、clubId 等的名称保留...
我有以下脚本
<script>
$(window).load(function () {
var model = [
{
"reservation":
{
"ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
"clubId": 70656,
"courtNumber": 1,
"crud_name": "add",
"reservationtype_name": "toernooi"
}
},
{
"reservation":
{
"ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
"clubId": 70656,
"courtNumber": 1,
"crud_name": "update",
"reservationtype_name": "toernooi"
}
}
];
alert(JSON.stringify(model));
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "http://localhost:59854/api/incomingapi",
contentType: "application/json",
dataType: 'json',
success: function (result) { },
error: function (errResult) { }
});
});
</script>
我有以下控制器
public string Post(HttpRequestMessage request)
{
string jsonString1 = request.Content.ReadAsStringAsync().Result;
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
var v1 = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
var v2 = json_serializer.DeserializeObject(jsonString1);
JObject jobj1 = JObject.Parse("{ \"test\":\"some data\" }");
JObject jobj2 = JObject.Parse(jsonString1);
return "";
}
v1
和jobj1
用于测试。 jsonString1
填充了值。 v2
在运行时用值填充。
然而我只有这4种方法
- 等于()
- GetHashCode()
- GetType()
- ToString()
在我输入代码时可用...
我必须将 jsonString1
中的值转换为保留类型的集合或某种方式,然后我可以循环或使用 linq,但是当我尝试类似的操作时,值没有得到已填充(一切为空或 0)。
例如,下面我可以循环并使用 linq,但未填充值(是 0 和 0 而不是 70656 和 1):
var parsedVar = json_serializer.Deserialize<ICollection<ReservationModelForJson>>(jsonString1);
var clubId = parsedVar.First().clubId;//is 0 should be 70656
var courtNumber = parsedVar.First().courtNumber;//is 0 should be 1
谁能解决这个问题?非常感谢!
public class ReservationModelForJson
{
public string ticketId { get; set; }
public int clubId { get; set; }
public int courtNumber { get; set; }
public string crud_name { get; set; }
public string reservationtype_name { get; set; }
}
ANSWER/SOLUTION:
我在下面添加了class
public class JsonBinder
{
public ReservationModelForJson reservation { get; set; }
}
并将我的控制器更改为
public string Post(IEnumerable<JsonBinder> reservations)
{
int clubId = reservations.First().reservation.clubId;
int courtNumber = reservations.First().reservation.courtNumber;
return "tnkx!";
}
试试这个:
json_serializer.Deserialize<List<ReservationModelForJson>>(jsonString1);
并且您的 courtNumber
等属性位于 reservation
对象中,因此例如您应该使用 parsedVar.First().courtNumber;
。 ReservationModelForJson
的结构在这种情况下很重要。
这应该有效。不要使用 Post 方法中的 HttpRequestMessage 参数,而是使用 ReservationModelForJson 的集合。此外,您可能需要删除 JSON.stringify(model),然后只传递模型。
public string Post(IEnumerable<ReservationModelForJson> reservations)
{
//Now you can work with the reservations collection
var firstRes = reservations.FirstOrDefault();
}
这是因为你的反序列化失败了。您尝试在服务器端反序列化的内容与您的 json 模型不匹配。目前您正在尝试反序列化具有 属性 名称保留的对象列表(这是具有预期属性的对象)。要修复,请像下面那样改造您的 json。
var model = [
{
"ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
"clubId": 70656,
"courtNumber": 1,
"crud_name": "add",
"reservationtype_name": "toernooi"
},
{
"ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
"clubId": 70656,
"courtNumber": 1,
"crud_name": "update",
"reservationtype_name": "toernooi"
}
];
或者创建一个 class 对象 属性 具有预期属性、ticketId、clubId 等的名称保留...