我一直在阅读关于反序列化json的线索,并尝试了很多方法来实现它,但似乎无法实现这一目标。 这是我到目前为止所做的:
类
public class oVesselMovement : oVMLocation, IWPConditions, IVessel, IStatus
{
public int wpID { get; set; }
public string charts { get; set; }
public string latNS { get; set; }
public string longEW { get; set; }
public string course { get; set; }
public double toNextWPNM { get; set; }
public double toGoNM { get; set; }
public string eda { get; set; }
public string eta { get; set; }
}
根类
public class RootVM
{
public List<oVesselMovement> jsnObj { get; set; }
}
JSON
{"jsnObj":[{"vmID":"1","charts":"2111","latNS":"10°29.10 N","longEW":"123°25.83 E","course":"420°","toNextWPNM":0,"toGoNM":"27","eda":"12-15-2016","eta":"11:01"},{"vmID":"2","charts":"2211","latNS":"11°29.10 N","longEW":"124°25.83 E","course":"420°","toNextWPNM":0,"toGoNM":"27","eda":"12-15-2016","eta":"11:01"}]}
反序列化
[WebMethod]
public void saveVMDT(string jsnObj)
{
RootVM rootObj = new JavaScriptSerializer().Deserialize<RootVM>(jsnObj);
foreach (var obj in rootObj.jsnObj)
{
try
{
...
}
我也试过将List<oVesselMovement> jsnObj { get; set; }
转换为。{
oVesselMovement[] jsnObj
但无济于事。
我一直收到这个错误:
&#34; {&#34;消息&#34;:&#34;类型\ u0027System.String \ u0027不支持反序列化数组。&#34; ....
任何帮助都将不胜感激。
答案 0 :(得分:0)
toGoNM
是一个字符串,而不是数字。您需要使用正确的类型,在C#端或JSON端修复它。您在C#类中有wpID
,但在JSON中有vmID
;而且,错误的类型。
答案 1 :(得分:0)
我不确定JavaScriptSerializer在内部做了什么,但是newtonsoft的JToken处理得很好。以下代码有效:
public class oVesselMovement //notice no ancestor class or interfaces
{
public int wpID { get; set; }
public string charts { get; set; }
public string latNS { get; set; }
public string longEW { get; set; }
public string course { get; set; }
public double toNextWPNM { get; set; }
public double toGoNM { get; set; }
public string eda { get; set; }
public string eta { get; set; }
}
public class RootVM
{
public List<oVesselMovement> jsnObj { get; set; }
}
public class MakeItSo
{
public const string json = "{\"jsnObj\":[{\"vmID\":\"1\",\"charts\":\"2111\",\"latNS\":\"10°29.10 N\",\"longEW\":\"123°25.83 E\",\"course\":\"420°\",\"toNextWPNM\":0,\"toGoNM\":\"27\",\"eda\":\"12-15-2016\",\"eta\":\"11:01\"},{\"vmID\":\"2\",\"charts\":\"2211\",\"latNS\":\"11°29.10 N\",\"longEW\":\"124°25.83 E\",\"course\":\"420°\",\"toNextWPNM\":0,\"toGoNM\":\"27\",\"eda\":\"12-15-2016\",\"eta\":\"11:01\"}]}";
public void SaveVmd()
{
RootVM rootObj = JToken.Parse(json).ToObject<RootVM>();
Console.WriteLine($"Parsed {rootObj.jsnObj.Count} vessel movement objects");
}
}
class Program
{
static void Main(string[] args)
{
var makeitso = new MakeItSo();
makeitso.SaveVmd();
}
}
但请注意,我没有将oVesselMovement作为oVMLocation的祖先或任何接口的实现者。我认为问题可能在于oVMLocation中不在json中的字段或属性。