我正在尝试将JSON字符串反序列化为大对象;我正在使用Angular将我的数据发送到控制器。数据到达控制器时存在且正确,但在反序列化后,它为空。我已经看了一些问题,比如这个问题:
Deserialization of JSON.Net returns 'null'
基于上述问题的答案以及撰写问题的用户的评论,我的代码应该有效,但事实并非如此。
这是我的代码:
[HttpPost]
public OnlineOrderValidation Post(HttpRequestMessage request)
{
Task<string> result = request.Content.ReadAsStringAsync();
var json = result.Result;
OnlineOrder order = new OnlineOrder();
order = JsonConvert.DeserializeObject<OnlineOrder>(json);
// Save first
_orderFacade.UpdateCurrentOrder(CacheStore, order);
var validation = _orderFacade.ValidateOrder(order);
return validation;
}
OnlineOrder类应接受来自JsonConvert.DeserializeObject(json)的所有数据,但值为0,null或false。 我也尝试过DeserializeAnonymousType(字符串json,T anonObject)和JavasScriptSerializer.Deserialize(字符串数据),它们都产生一个空值为null的OnlineOrder对象。
我也试过将对象传递给控制器,如下所示:
public OnlineOrderValidation Post([FromBody]string ooJson)
{
var order = JsonConvert.DeserializeObject<OnlineOrder>(ooJson);
//work with order object...
}
并且喜欢这个
public OnlineOrderValidation Post([FromUri]string ooJson)
{
var order = JsonConvert.DeserializeObject<OnlineOrder>(ooJson);
//work with order object...
}
我想知道问题出在'ReadAsStringAsync()'上。我注意到它无法在OnlineOrder上吐出每个属性。此方法的异步部分必须在完成解析字符串时添加每个字段/值对,并且由于结果中的第一个字段与OnlineOrder对象上的第一个字段不匹配,因此JsonConvert.DeserializeObject()可能会停止执行。 / p>
我是否需要为OnlineOrder创建一个包装类并反序列化?在反序列化之前,是否需要对“结果”对象中的字段重新排序?还有别的我做错了吗?谢谢大家!
编辑:根据要求,这是我的JSON。实际对象比这个大得多,但你明白了。 JSON字符串具有有效数据,但在反序列化后可以为空或归零。
{"isTMIOfferEligible":false,
"tmiOfferCode":null,
"tmiUpgradeOfferCode":null,
"id":"a34mdxdivt0svmu1okucidbi",
"accountNumber":"111111111",
"transferAccountNumber":"222222222",
"serviceAddress":
{"address":"3922 N STREET AVE",
"addressLine":"3901 N STREET AVE",
"suite":"SYNCRD",
"city":"SOOFOO",
"state":"SD",
"zip":"57000",
"franchise":"111",
"market":"1 "},
"transferAddress":
{"disconnectDate":null,
"transferFromAddress":
{"address":"1234 SOME PLACE",
"addressLine":"1234 SOME PLACE",
"suite":"SYNCRD",
"city":"SOOFOO",
"state":"SD",
"zip":"57000",
"franchise":"123",
"market":"Z "
}
}
}
编辑2 我已更新我的代码以从自定义异步方法反序列化JSON字符串,并在分配时实例化OnlineOrder:
try
{
var orderTask = ReadStringAsynchronously(request);
OnlineOrder order = orderTask.Result;
//work with order object
}
catch (Exception ex) { //...}
private async Task<OnlineOrder> ReadStringAsynchronously(HttpRequestMessage request)
{
try
{
var json = await request.Content.ReadAsStringAsync();
OnlineOrder orderAsync = JsonConvert.DeserializeObject<OnlineOrder>(json);
return orderAsync;
}
catch (Exception)
{
throw new Exception("Error occurred while reading string asynchronously.");
}
}
任务上的订单对象仍为空。
答案 0 :(得分:0)
在这种情况下,问题出在JSON字符串本身。在JSON字符串中嵌套了未编码的HTML。在发布到服务器之前,我在自定义方法中使用了encodeURIComponent(value):
array_append(sort_col, 999)
我可以通过在请求正文中发布对象来获取有效数据到服务器。