【问题标题】:Get JSON string as object at server side and deserialize it在服务器端获取 JSON 字符串作为对象并反序列化
【发布时间】:2020-02-22 22:54:00
【问题描述】:

我在控制器上有一个方法,它接受一个对象,我需要根据我在 DI 中创建服务的方式来进行不同的反序列化。 方法是bool SetSnmpRequest(Object obj);

然后在控制器中

public IActionResult Set([FromBody]object details)
    {
        bool setSuccesses = _devicesManager.SetSnmpRequest(details);

        if (setSuccesses)
            return Ok();

        return BadRequest();
    }

这是从客户端{"Name":"Power" ,"Value":"MED","ChannelIndex":"1"}传递过来的JSON

我试图反序列化的对象

public class SetRequestModel
        {
            public string Name { get; set; }
            public string Value { get; set; }
            public int ChannelIndex { get; set; } = 0;
        }

反序列化SetRequestModel details = JsonConvert.DeserializeObject<SetRequestModel>((string)obj);

问题在于 JsonConvert.DeserializeObject 需要一个字符串,而在将对象转换为字符串时出现异常

System.InvalidCastException: Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'System.String'.

【问题讨论】:

    标签: c# .net jsonconvert


    【解决方案1】:

    让你的中间件为你做它的事。

    public IActionResult Set([FromBody]SetRequestModel details)
    {
        ...
    }
    

    如果你真的想接收泛型对象,你首先需要序列化它,然后反序列化它。这是因为它作为匿名对象而不是字符串传递到您的操作方法中。但是在动作签名中使用您的类型化模型被认为是一种更好的做法。

    查看这个官方教程:Create a Web API with ASP.Net Core

    【讨论】:

    • 让控制器处理它不是一个好的解决方案,因为 IDeviceManager 的其他实现可能有其他细节。但首先对其进行序列化,然后对其进行反序列化。
    • 那我建议你考虑把它分解成更多的方法,更多的模型。但如果它有效,它就有效:)
    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多