我需要向包含以下JSON的服务器发布请求。我想在表示请求的类上使用DataContractJsonSerializer和DataContract,DataMember属性,如
{"method":"mymethod","parameters":[10,"somestring"]}
这表示RPC调用
mymethod(10,"somestring").
在某些API中。 API中有许多使用不同参数列表的调用。
如果参数列表包含T类型的对象,我可以使用泛型List<T>
,这很简单,但API需要不同类型的参数列表(包括非原始对象)。
那么如何构造参数数组的DataContract?
答案 0 :(得分:0)
您需要执行所有参数字符串类型 - 将有参数的序列化值。 然后你需要这样做:
using System;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Json;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string methodName = "test";
MethodInfo methodInfo = typeof(ClassWithMethods).GetMethod(methodName);
string[] parameters = new string[] { "1", "\"qwe\"", "{\"SomeProperty\":\"prop\"}" };
object[] parameterValues = new object[parameters.Length];
for (int i = 0; i < parameters.Length; i++)
{
DataContractJsonSerializer s = new DataContractJsonSerializer(methodInfo.GetParameters()[i].ParameterType);
object p = s.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(parameters[i])));
parameterValues[i] = p;
}
methodInfo.Invoke(new ClassWithMethods(), parameterValues);
}
}
public class ClassWithMethods
{
public void test(int i, string s, ComplexType ct)
{
Console.WriteLine("{0} {1} {2}", i, s, ct.SomeProperty);
}
}
public class ComplexType
{
public string SomeProperty { get; set; }
}
}
答案 1 :(得分:0)
谢谢卢卡斯。所以稍微重申一下问题,包括复杂的类型: -
{ “方法”: “的MyMethod”, “参数”:[10, “somestring”,{SomeProperty:值}]}
这表示对JSON RPC调用的调用 的MyMethod(INT,字符串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();
}
}
}