2016-12-02 52 views
3

我一直在阅读有关反序列化json的线程,并尝试了很多方法来实现它,但似乎无法完成此工作。 这是我到目前为止已经完成:类型System.String不受数组支持

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但无济于事。

我不断收到此错误:

"{"Message":"Type \u0027System.String\u0027 is not supported for deserialization of an array."....

任何帮助,将不胜感激。

+0

请尝试[this](http://stackoverflow.com/a/25654220/5588347)。 –

+0

使用Json.net。我试过它的代码它的作品 – esiprogrammer

回答

0

toGoNM是一个字符串,而不是数字。你需要使用正确的类型,修正它在C#端或JSON端。您在C#类中有wpID,但在JSON中有vmID;再次,错误的类型。

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中。

相关问题