1

助けてください、私は立ち往生しています。次のようなものを返す WCF サービスがあります。

{
   "GetDataRESTResult":
     [
       {"Key1":100.0000,"Key2":1,"Key3":"Min"},
       {"Key1":100.0000,"Key2":2,"Key3":"Max"}
     ]
}

それをデシリアライズしたいのですが、何を使用しても (JSON.NET または DataContractJsonSerializer)、エラーが発生します。DataContractJsonSerializer を使用する場合、次のコードを使用しています。

byte[] data = Encoding.UTF8.GetBytes(e.Result);
MemoryStream memStream = new MemoryStream(data);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<DataDC>));
List<DataDC> pricinglist = (List<DataDC>)serializer.ReadObject(memStream);

ここで、DataDC は、JSON データを取得している WCF REST サービスのサービス参照から取得したデータ コントラクトであり、取得しているエラーは InvalidCastException です...

JSON.NET を使用しようとすると、別の例外が発生しますが、まだ何もわかりません。誰か助けてもらえますか?

編集 JSON.NET スタックトレースは次のとおりです。

現在の JSON オブジェクト (例: {"name":"value"}) を型 'System.Collections.Generic.List`1[MyApp.MyServiceReference.DataDC]' に逆シリアル化できません2,3]) 正しく逆シリアル化します。このエラーを修正するには、JSON を JSON 配列 ([1,2,3] など) に変更するか、逆シリアル化された型を通常の .NET 型 (整数のようなプリミティブ型ではなく、コレクション型ではない) に変更します。 JSON オブジェクトから逆シリアル化できる配列またはリスト)。JsonObjectAttribute を型に追加して、強制的に JSON オブジェクトから逆シリアル化することもできます。パス「GetDataRESTResult」、1 行目、位置 23。

4

2 に答える 2

6

{"GetDataRESTResult":[{"Key1":100.0000、 "Key2":1、 "Key3": "Min"}、{"Key1":100.0000、 "Key2":2、 "Key3": "Max"}] }

データはJSONオブジェクトです(値としてJSON配列を持つ1つのキー「GetDataRESTResult」があります)。そのため、デシリアライズする必要のあるタイプは、コレクションではなくオブジェクトである必要があります。

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataDC));
DataDC pricinglist = (DataDC)serializer.ReadObject(memStream);

タイプDataDCが次のようになっている場合は機能します。

public class DataDC
{
    public List<Keys> GetDataRESTResult { get; set; }
}
public class Keys
{
    public double Key1 { get; set; }
    public int Key2 { get; set; }
    public string Key3 { get; set; }
}
于 2012-10-03T04:05:11.663 に答える
3

以下のコードは動作します

string json = @" {""GetDataRESTResult"":[{""Key1"":100.0000,""Key2"":1,""Key3"":""Min""},{""Key1"":100.0000,""Key2"":2,""Key3"":""Max""}]}";

dynamic dynObj = JsonConvert.DeserializeObject(json);
foreach (var item in dynObj.GetDataRESTResult)
{
    Console.WriteLine("{0} {1} {2}", item.Key1, item.Key3, item.Key3);
}

Linqも使えます

var jObj = (JObject)JsonConvert.DeserializeObject(json);
var result = jObj["GetDataRESTResult"]
                .Select(item => new
                {
                    Key1 = (double)item["Key1"],
                    Key2 = (int)item["Key2"],
                    Key3 = (string)item["Key3"],
                })
                .ToList();
于 2012-10-02T22:25:29.077 に答える