0

次の JSON を含むサーバーにリクエストを送信する必要があります。などのリクエストを表すクラスで DataContractJsonSerializer と DataContract、DataMember 属性を使用したい

{"method":"mymethod","parameters":[10,"somestring"]}

これは RPC 呼び出しを表します

mymethod(10,"somestring"). 

一部の API で。API には、さまざまなパラメーター リストを使用した呼び出しが多数あります。

これは、パラメーター リストにジェネリックを使用できる T 型のオブジェクトが含まれている場合は簡単ですList<T>が、API にはさまざまな型のパラメーターのリストが必要です (非プリミティブ オブジェクトを含む)。

では、どのようにパラメータ配列の DataContract を構築できますか?

4

2 に答える 2

0

ありがとうルーカス。したがって、複雑なタイプを含めるために質問を少し言い直します:-

{"メソッド":"mymethod","パラメーター":[10,"somestring",{SomeProperty:値}]}

これは、JSON RPC call mymethod(int,string,ComplexProperty) の呼び出しを表します。

The code is:-

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;

namespace JSONConsoleApplication4
{
    class Program
    {
        [DataContract]
        public class ComplexType
        {
            [DataMember]
            public string SomeProperty { get; set; }
        }

        [DataContract]
        public class GenericRequest
        {
            [DataMember]
            public string method { get; set; }
            [DataMember]
            public object[] parameters { get; set; }
        }


        static void Main(string[] args)
        {
            MemoryStream ms = new MemoryStream();
            DataContractJsonSerializerSettings settings = 
                new DataContractJsonSerializerSettings() { EmitTypeInformation=EmitTypeInformation.Never, 
                                                           KnownTypes=new Type[] { typeof(ComplexType) } };
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(GenericRequest),settings);
            serializer.WriteObject(ms, 
                new GenericRequest() { method = "mymethod", 
                                       parameters = new object[] { 10, "somestring", new ComplexType() { SomeProperty="value"}} });
            ms.Position = 0;
            string v = new StreamReader(ms).ReadToEnd();
        }
    }
}
于 2013-11-30T16:46:47.543 に答える