.net Core webapi 接收post复杂实体

qq_37583925 2017-12-27 04:41:41
post数据格式如下:

圈出来的event_content的格式未知,要根据type来解析的。但是我后端设置event_content对应不管是string/object/dynamic都是null。请问一下event_content该设置为什么格式?传送端应该是正确的,因为是别人提供的API。
诚信求教大佬,QAQ
...全文
1755 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qq_37583925 2018-01-03
后来看了一下,因为没法看到发送方的源码。但是需要加上[FromBody]才可以,这方面我还要再去看看。但是项目上面暂时没问题了
回复
你多跑几次就完事了啊
回复
反射加载命令处理对象 --> 获取反射加载命令处理对象类型
回复
上面的例子里的 object 写的不对,应该是你定义的接口。 大致举个例子,代码应该是
    JObject obj = JObject.Parse(jsonStr);
    Type type = 反射加载命令处理对象((int)obj["type"]);
    var cmd = (IMyCommand)Activator.CreateInstance(type);
    var evt = cmd.ParseContent((JObject)obj["event_content"]);
这里,通过 jsonStr,来获得 type,然后获得 cmd,并且知道所有的实现了 IMyCommand 接口的对象都实现 ParseContent 函数功能,返回一个具有 IMyEventContent 接口的数据对象。于是反射出来命令处理对象 cmd,调用其 ParseContent 功能。 而不同的命令处理对象,其 ParseContent 函数内部返回的具体的对象的类型是不同的。但是你要按照业务接口来设计开发。
回复
引用 楼主 qq_37583925 的回复:
post数据格式如下: 圈出来的event_content的格式未知,要根据type来解析的。但是我后端设置event_content对应不管是string/object/dynamic都是null。请问一下event_content该设置为什么格式?传送端应该是正确的,因为是别人提供的API。 诚信求教大佬,QAQ
假设使用 Newtonsoft.Json 首先,你可以解析为 JObject。然后当你确定 event_content 目标类型的时,例如调用一个 ATM 处理类,那么这个类就可以写
override
 object ParseContent(JObject obj)
{
    return obj.ToObject<ATM>();
} 
并且你的解析程序的多态代码可以写为
(IMyEventContent)command.ParseContent((JObject)obj["event_content"]);
编程设计要按照接口来理解和执行。如果你设计软件时根本不知道 IMyEventContent 的业务含义,那么你根本无需解析 json 中的 event_content 这个 token。如果你知道接口的业务含义,但是你需要根据 type 为 1 时反射获取命令处理类型,那么这就一定是多态调用 ParseContent 并且返回 IMyEventContent 的设计模式了。
回复
你这个实际肯定是有对应业务逻辑的,你应该按照type不同建立对应的反序列化实体 然后如果业务中可以确定来源是什么,那就直接用对应的类型去反序列化,否则按type取对应的反序列化,但还是不好写,存在硬编码问题 如果不确定,那就正则获取type对应的字段
回复
丰云 2017-12-28
我能想到的方法,就是写一个切面程序,替代mvc的参数格式化方法,在这个方法里,对这种情况单独做判断处理
回复
丰云 2017-12-28
你这种不确定的动态结构,没法对象接收,这点是可以肯定的!! 所以不用在这个方面花心思了
回复
mirrorspace 2017-12-27
那就用最原始的办法 不用方法参数,直接获取HTTP原始数据.然后再分析
回复
xuezt 2017-12-27
定义成object看看是收到什么数据
回复
dynamic是要整个json对象都反序列化为dynamic,而不是其内某个字段反序列化为dynamic
回复
qq_37583925 2017-12-27
引用 3 楼 hanjun0612 的回复:
.net core还没用过。 不过我觉得你应该贴出你的代码。 我个人认为dynamic应该是没问题的才对。
我也认为dynamic应该没问题,但是就是不行。。
回复
qq_37583925 2017-12-27
引用 2 楼 mirror030 的回复:
如果event_content内的属性是固定的. 造个这样的类然后 event_content=这个类 就能得到参数了 如果传来的JSON是复杂的,那么应该传一个字符串过来.而不是表单参数. 因为后台拿到JSON字符串后,可以解析成字典或者动态类型.多复杂的都能搞定
对接文档上说传过来的是JSON格式的,event_content不固定,有40多种情况。
回复
thiefx 2017-12-27
引用 3 楼 hanjun0612 的回复:
.net core还没用过。 不过我觉得你应该贴出你的代码。 我个人认为dynamic应该是没问题的才对。
一劳永逸。。。
回复
qq_37583925 2017-12-27
引用 1 楼 starfd 的回复:
dictionary,看其value格式是固定的

event_content是不固定的,我贴的只是一种情况,有可能是
这种
回复
正怒月神 版主 2017-12-27
.net core还没用过。 不过我觉得你应该贴出你的代码。 我个人认为dynamic应该是没问题的才对。
回复
mirrorspace 2017-12-27
如果event_content内的属性是固定的. 造个这样的类然后 event_content=这个类 就能得到参数了 如果传来的JSON是复杂的,那么应该传一个字符串过来.而不是表单参数. 因为后台拿到JSON字符串后,可以解析成字典或者动态类型.多复杂的都能搞定
回复
dictionary,看其value格式是固定的
回复
相关推荐
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2017-12-27 04:41
社区公告
暂无公告