ルートマイレージに関するデータを取得するために Web サービスを使用しています。次に、デシリアライザーを使用して解析しています。JSON は次のようになります。
[{"__type":"CalculateMilesReport:http:\/\/pcmiler.alk.com\/APIs\/v1.0","RouteID":null,"TMiles":445.5]
この応答には、いくつかの問題がありました。がコレクションにラップされるのはなぜですか? オブジェクト モデルを設定するにはどうすればよいですか? また、特別な __type 属性について不平を言っていました。だから、「ハック」して「準備」した文字列:
// Cut off first and last charachters [] - they send objects as arrays
rawJSON = rawJSON.Substring(1, rawJSON.Length - 2);
// Hide "__type" attribute as it messes up serializer with namespace
rawJSON = rawJSON.Replace("__type", "type");
その後、すべてがこのオブジェクトで機能しました:
[DataContract]
public class PCMilerResponse
{
[DataMember(Name = "Errors", EmitDefaultValue = false)]
public PCMilerError[] Errors { get; set; }
[DataMember(Name = "TMiles", EmitDefaultValue = false)]
public decimal DrivingDistance { get; set; }
}
今、私はWebサービスへの呼び出しを変更し、次の応答を受け取りました
[
{"__type":"CalculateMilesReport:http:\/\/pcmiler.alk.com\/APIs\/v1.0","RouteID":null,"TMiles":445.5},
{"__type":"GeoTunnelReport:http:\/\/pcmiler.alk.com\/APIs\/v1.0","RouteID":null,"GeoTunnelPoints":
[{"Lat":"34.730466","Lon":"-92.247147"},{"Lat":"34.704863","Lon":"-92.29329"},{"Lat":"34.676312","Lon":"-92.364654"},{"Lat":"29.664271","Lon":"-95.236735"}]
}
]
これで、配列と「__type」が存在する理由がわかりました。しかし、オブジェクトを適切に解析するためにオブジェクトを記述する方法がわかりません。特別な属性を適用する必要があり、おそらく汎用配列が必要だと思いますか? 適切に逆シリアル化する方法について何か助けはありますか?
PS私はさらにハッキングを行い、それらの文字列をオブジェクト内の2つのオブジェクトに置き換えることができますが、それを処理する「適切な」方法があるかどうか疑問に思います。