解析Json .Net Web Api
解析Json .Net Web Api
我是新手,对Web API 2 / Entity Framework 6项目不太熟悉,我正在制作REST服务,但是对于一个特定的服务,在对模型的任何实体进行CRUD操作之前,我将接收到一个JSON(通过Post方式),(必须对数据进行一些业务验证,添加或补充一些内容,并决定保存在哪个实体上),JSON如下所示:
{
"head": {
"action": "create",
"object": "oneobject",
"user": "theuser"
},
"object": {
"name1": "a name 1",
"name2": "a name 2",
"description": "a description here"
},
"rule": [{
"name": "any name",
"value": "any value"
}, {
"name": "another name",
"value": "another value"
}]
}
所以这个JSON不直接映射到一个实体,实际上我没有这个模型或对象。有什么更好的方法来处理它呢?我的意思是如何接收和解析JSON。我对web api和rest服务都不太熟悉,希望你们能帮助我,并且给我解释得详细一些。谢谢大家。
编辑:
- 有没有关于匹配这种类型的JSON的POCO或类的想法。 ("rule"列表是可变的,可以是一个或多个)。
- 创建了这个POCO或类之后,我需要基于它创建一个控制器吗?
问题的出现原因是在Web API方法中,需要解析JSON请求的主体。为了解决这个问题,可以创建一个类来模拟预期返回的对象。然后在Web API方法中,可以使用[FromBody]属性来自动解析请求的主体。
解决方法如下:
首先创建一个数据合同类来定义数据结构:
public class MyContract { public string MyData { get; set;} }
然后,在ApiController中的方法中使用[FromBody]属性来解析请求的主体:
[HttpPost] [Route("api/myobject")] public async Task ReceiveMyObject([FromBody]MyContract object) { var data = object.MyData; // 在这里做你需要做的事情。 }
这样做可以保持代码的整洁和组织性。
在具体的情况中,可以根据JSON数据创建一个合同类,如下所示:
public class MyContract { [JsonProperty("head")] public MetaObject Head { get; set; } // 不确定这样做是否有效,但很可能有效 [JsonProperty("object")] public JObject ExtendedInformation { get; set; } [JsonProperty("rule")] public Rule[] Rules { get; set; } } public class Rule { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("value")] public string Value { get; set; } }
以上是关于如何创建一个模拟JSON的类的示例。在具体的情况下,可以根据JSON的结构和属性来创建适当的类。感谢您的帮助和时间。
问题:解析Json .Net Web Api时出现的原因和解决方法
在解析Json数据时,虽然Json数据在模型中可能不代表一个逻辑实体,但是你明确地已经在代码片段中定义了Json数据的“形状”,这表明你对Json数据有一个心理模型。你应该创建一个POCO(普通的C#对象)来表示这个模型,并将传入的Json请求反序列化为该类型的对象。一旦将其反序列化为对象,使用对象属性等处理这些数据将变得非常简单。
这个JSON的POCO应该是什么样的呢?因为它有三个对象(head,object,rule),而“rule”对象可能是一个可变的列表。
抱歉,刚刚看到了你的评论。看起来下面有一些很好的回答。
谢谢Forbes的帮助和时间。
问题的出现原因:
该问题的出现是因为需要将JSON数据解析为.NET Web API中的对象。根据提供的信息,我们需要一个POCO对象来表示请求。
解决方法:
可以使用以下代码来解决该问题:
public enum CrudAction { Create, Read, Update, Delete } public sealed class CrudRequestHeader { public CrudAction Action { get; set; } public string Object { get; set; } public string User { get; set; } } public sealed class RuleDefinition { public string Name { get; set; } public string Value { get; set; } } public sealed class CrudRequest { public CrudRequestHeader Head { get; set;} public DictionaryObject { get; set; } public List Rule { get; set; } }
在Web API控制器方法中,可以使用CrudRequest
类型的参数,这样JSON数据将被反序列化为该对象,例如:
public IHttpActionResult Post(CrudRequest crudRequest) { // TODO 实现 }
注意,我在CrudRequest.Object
中使用了Dictionary
,因为我们无法确定会提供多少个键值对,我假设所有的值都是字符串,如果你愿意,也可以使用object
类型的值,但是你需要处理值的类型。同样的原则,我在CrudRequest.Rule
中使用了List
来处理可能提供的规则的可变数量。
可以在以下链接中找到一个包含上述定义和使用你的输入的LINQPad样例:[http://share.linqpad.net/7rvmhh.linq](http://share.linqpad.net/7rvmhh.linq)
感谢你的帮助和时间,它完美地解决了我的问题。这是我经过数小时尝试后唯一有效的方法。不确定是因为我转到了CORE,但是这真的很困难。