JSON 反序列化



我有一个简单的WCF RESTful服务,只有一个操作,该操作将字符串作为参数void Process(string item)item是一个 JSON 序列化对象,它可以是任何对象。

在这种特殊情况下,可以将大约 20 个不同的类发送到此服务。反序列化这些对象的正确和方便的方法是什么?我怎么知道 JSON 背后的实际内容?我可以包含一些Type字段,并执行类似使用 Json.NET 的操作:

dynamic json = JsonConvert.DeserializeObject(input);

,检查json.Type然后用JsonConvert.DeserializeObject<T>()反序列化输入字符串,但我不确定这是一个好主意。你有什么想法吗?

尽管我会将 WCF 与注释中提到的许多 OperationContract 方法一起使用,但动态方式也是可能的。不要忘记,省略了许多检查,并且有很大的改进空间。只需将其视为 POC 工作即可。

假设您有一个要对其执行方法的服务器对象。

public class ServerClass1
{
    public int Add(int i,int j)
    {
        return i + j; 
    }
    public string Hello()
    {
        return "HELLO";
    }
}

您以某种方式收到了这些 JSON 并动态执行

要求1 : {"method":"Add","parameters":[3,5]}

var res1 = Exec(req1, new ServerClass1());

要求2:{"method":"Hello","parameters":null}

var res2 = Exec(req2, new ServerClass1());

帮助程序方法/类

public class Request
{
    public string method;
    public object[] parameters;
}
public static object Exec(string json, object target)
{
    var req = JsonConvert.DeserializeObject<Request>(json);
    var method = target.GetType().GetMethod(req.method, BindingFlags.Public | BindingFlags.Instance);
    if (method == null) throw new InvalidOperationException();
    object[] parameters = new object[0];
    if (req.parameters != null)
    {
        parameters = method.GetParameters().Zip(req.parameters, (m, p) => Convert.ChangeType(p, m.ParameterType)).ToArray();
    }
    return method.Invoke(target, parameters);
}

相关内容

  • 没有找到相关文章

最新更新