如何序列化不同类型且没有名称的JSON参数列表

时间:2013-11-29 11:49:20

标签: .net json datacontractjsonserializer

我需要向包含以下JSON的服务器发布请求。我想在表示请求的类上使用DataContractJsonSerializer和DataContract,DataMember属性,如

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

这表示RPC调用

mymethod(10,"somestring"). 

在某些API中。 API中有许多使用不同参数列表的调用。

如果参数列表包含T类型的对象,我可以使用泛型List<T>,这很简单,但API需要不同类型的参数列表(包括非原始对象)。

那么如何构造参数数组的DataContract?

2 个答案:

答案 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();
        }
    }
}