3

サービスによって生成されたこのjsonがあるとします。

[{"key1": 12, "key2": "ab"}, {"key1": 10, "key2": "bc"}]

これは、wcf restによって取得され、CollectionDataContractをリストとして使用して解析され、DataContractを使用して自動的に再度解析される可能性がありますか?

私はそうしようとしましたが、常に「ルートレベルは無効です、行1、位置1」を指定します

4

1 に答える 1

3

[CDC]とJSONについて特別なことは何もありません-それはうまくいくはずです-以下のコードを参照してください。ネットワークトレース(Fiddlerなどのツールで見られる)を含めて、それを自分のものと比較して、何が違うかを確認してください。

public class StackOverflow_15343502
{
    const string JSON = "[{\"key1\": 12, \"key2\": \"ab\"}, {\"key1\": 10, \"key2\": \"bc\"}]";
    public class MyDC
    {
        public int key1 { get; set; }
        public string key2 { get; set; }

        public override string ToString()
        {
            return string.Format("[key1={0},key2={1}]", key1, key2);
        }
    }

    [CollectionDataContract]
    public class MyCDC : List<MyDC> { }

    [ServiceContract]
    public class Service
    {
        [WebGet]
        public Stream GetData()
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";
            return new MemoryStream(Encoding.UTF8.GetBytes(JSON));
        }
    }

    [ServiceContract]
    public interface ITest
    {
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        MyCDC GetData();
    }

    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        host.Open();
        Console.WriteLine("Host opened");

        WebChannelFactory<ITest> factory = new WebChannelFactory<ITest>(new Uri(baseAddress));
        ITest proxy = factory.CreateChannel();
        var result = proxy.GetData();
        Console.WriteLine(string.Join(", ", result));
        ((IClientChannel)proxy).Close();
        factory.Close();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
于 2013-03-11T17:34:59.757 に答える