2016-12-02 19 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 
     { 
      ... 
    } 

私もoVesselMovement[] jsnObj ではなく無駄にList<oVesselMovement> jsnObj { get; set; }を変換しようとしました。

私はこのエラーを取得しておいてください。

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

任意の助けをいただければ幸いです。

+0

[こちら](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(); 
     } 
    } 

注しかし、私はoVMLocationの祖先または任意のインターフェースの実装としてoVesselMovementを持っていないこと。問題は、jsonにないoVMLocationのフィールドやプロパティにあると考えられます。

関連する問題