重写api和反序列化对象

时间:2017-02-14 07:24:12

标签: c# json asp.net-web-api asp.net-web-api2

我正在尝试将旧的api迁移到webapi。问题是体验有限,所以我在这里问这个问题。

当前的api在单个url中接受json有效负载。说/api。 json有效负载具有以下结构

{'action': 'login', 'username': 'user1', 'password': 'password1'}

这应该是像/api/login这样的路线,所以我可以做类似

的事情
[Route("api/Login")]
public string Login(Login login)

并为反序列化定义一个类,如

class Login
{
    public string username{ get; set; }
    public string password{ get; set; }
}

所以我做了一个接受[FromBody]有效负载的路由,但我很难找到一种方法来根据动作以一种很好的方式反序列化对象。

每个有效负载都可以是一个有效的可序列化对象,具有我描述的方式如果从有效负载中删除action密钥。

任何不会产生丑陋代码的建议?请不要api重写或v2答案。如果我能做到,我就不会问这个。

1 个答案:

答案 0 :(得分:3)

假设每个有效负载中都存在“action”,您可以将其反序列化为动态类型,然后检查操作值,然后在知道此操作后再次将有效负载转换为特定类型。这解决了您遇到的特定问题。

所以你的端点代码看起来像这样:

//this is written from memory, so could have mistakes ...
var deserialisedData = Newtonsoft.Json.JsonConvert.DeserialiseObject<dynamic>(payload);

switch ( deserialisedData.action )
{
     case "someValue":
          //here you know what the action is so hopefully what kind of payload to              expect
          var properType = payload as SomeProperType
     break;
}

如果你考虑创建一个全新的,合适的api,你可以开始为每个动作引入端点,一次一个。将它们分开比让一个端点统治它们更好,可以这么说。