我将一些JSON从一个Web API传递到另一个Web API。在第一个API中,我序列化了对象,结果字符串看起来很好。当调用进入第二个API时,我在将JSON反序列化为对象时逐步执行该方法。
接收控制器内部:
string inputs = req.Content.ReadAsStringAsync().Result;
JSON字符串(inputs
变量)如下所示:(是的,这是在Text可视化工具中查看的):
{"LogEntry":"{\"Id\":0,\"AppName\":\"MyTestController\",\"LogMessage\":\"this is a test\",\"ServerName\":\"dev-test3\",\"LoggedOnDate\":\"2017-06-27T15:37:28.1691783-05:00\",\"LogType\":1}"}
现在我尝试使用以下命令将JSON反序列化回我的对象(LogEntry):
LogMgr.LogEntry logentry = JsonConvert.DeserializeObject<LogMgr.LogEntry>(inputs);
我在LogEntry字段中获取空值。
这是我的POCO类LogEntry:
public class LogEntry
{
public int Id { get; set; }
public string AppName { get; set; }
public string LogMessage { get; set; }
public string ServerName { get; set; }
public DateTime LoggedOnDate { get; set; }
public int LogType { get; set; }
}
出了点问题,但我无法看到。好像我之前在JSON数据中遇到转义字符问题。
在反序列化步骤中我可以检查什么?
答案 0 :(得分:2)
这里有两个问题。
在我看来,您的第一个API是对日志条目进行双重序列化。最有可能发生这种情况,因为您手动将控件方法中的条目序列化,然后将JSON字符串插入另一个对象,然后当从方法返回时,Web API会自动序列化该对象(因为它的设计目的),导致双序列化日志条目。
另一方面,您正在尝试将此JSON反序列化为LogEntry
类,但您没有考虑它周围的包装器对象。由于所有数据在JSON中都是一个级别,因此它与您尝试反序列化的类不匹配,并且所有内容最终都为空。
解决问题的最佳方法是更改第一个API,使其不会手动序列化日志条目,然后直接返回它而不将其包装在另一个对象中。如果你这样做,那么你最终应该得到如下所示的JSON:
{
"Id": 0,
"AppName": "MyTestController",
"LogMessage": "this is a test",
"ServerName": "dev-test3",
"LoggedOnDate": "2017-06-27T15:37:28.1691783-05:00",
"LogType": 1
}
这应该反序列化到你的LogEntry
课程中。