数组

时间:2016-12-02 10:19:48

标签: c# json

我一直在阅读关于反序列化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; ....

任何帮助都将不胜感激。

2 个答案:

答案 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中的字段或属性。