0

私は現在、JsonDeserializingコードを使用しています。これが私の問題です:

Jsonファイルで、次のような配列に遭遇しました。

"location":[47.618832,-122.21599]

簡単に二重配列に解析できます。

[DataMember(Name = "location")]
public double[] Location { get; set; }

しかし、この場合はオブジェクトを生成したいので、別の名前空間で定義されたタイプlocationの オブジェクトを呼び出しましょう。Coordinate次のようなコンストラクタがあります。

public Coordinate(double lat, double long)

この場合、Coordinateオブジェクトを直接生成する方法はありますか?

ありがとうございました

4

4 に答える 4

1

直接ではありませんが、よりクリーンな方法です。

public class MyClass
{
       [DataMember(Name = "location")]
       public double[] Location { get; set; }

       public Coordinate Coordinate
       {
            get
            {
                  if(Location.Lenght > 2)
                  {
                        return new Coordinate() { Lat = Location[0], Lang = Location[1] };
                  }

                  return null;
            }
       }

}

public class Coordinate
{
      public double Lat { get; set;}
      public double Lang { get; set;}
}
于 2012-07-16T17:20:26.353 に答える
1

解析されたデータを非公開としてマークし、必要な方法で公開することができます。

public class MyClass
{
   public struct Coordinate
   {
       public double Lat;
       public doubel Lon;
   }

   [DataMember(Name = "location")]
   private double[] _Location { get; set; }

   public Coordinate Location
   {
       get
       {
           return new Coordinate { Lat = _Location[0], Lon = _Location[1]};
       }
       set
       {
           double[0] = value.Lat;
           double[1] = value.Lon;
   }

}

私はこれをまとめただけで、おそらく Coordinate 型を不変にし、Equals と == 演算子の比較をオーバーライドしたことを確認します。

于 2012-07-16T17:30:32.553 に答える
0

IDataContractSurrogateインターフェイスを実装できます。

XMLスキーマドキュメント(XSD)のシリアル化、逆シリアル化、およびエクスポートとインポート中に、DataContractSerializerによって1つのタイプを別のタイプに置き換えるために必要なメソッドを提供します。

于 2012-07-16T17:23:54.563 に答える
0

私はJSonを直接操作していませんが、Locationプロパティが取得/設定するCoordinateプロパティを持つことができます。

// Not affected by JSon deserialization
[ScriptIgnore]
public Coordinate Coordinate {get; set;}

// Serialized/Deserialized by JSon
public double[] Location { 
    get 
        {
            return new double[] {Coordinate.Latitude,Coordinate.Longitude};
        } 
    set
        {
            Coordinate = new Coordinate(value[0],value[1]);
        }
}

もちろん、適切な境界チェックなどを追加する必要があります。

于 2012-07-16T17:24:19.623 に答える