解析Json .Net Web Api

19 浏览
0 Comments

解析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服务都不太熟悉,希望你们能帮助我,并且给我解释得详细一些。谢谢大家。

编辑:

  1. 有没有关于匹配这种类型的JSON的POCO或类的想法。 ("rule"列表是可变的,可以是一个或多个)。
  2. 创建了这个POCO或类之后,我需要基于它创建一个控制器吗?
0
0 Comments

问题的出现原因是在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的结构和属性来创建适当的类。感谢您的帮助和时间。

0
0 Comments

问题:解析Json .Net Web Api时出现的原因和解决方法

在解析Json数据时,虽然Json数据在模型中可能不代表一个逻辑实体,但是你明确地已经在代码片段中定义了Json数据的“形状”,这表明你对Json数据有一个心理模型。你应该创建一个POCO(普通的C#对象)来表示这个模型,并将传入的Json请求反序列化为该类型的对象。一旦将其反序列化为对象,使用对象属性等处理这些数据将变得非常简单。

这个JSON的POCO应该是什么样的呢?因为它有三个对象(head,object,rule),而“rule”对象可能是一个可变的列表。

抱歉,刚刚看到了你的评论。看起来下面有一些很好的回答。

谢谢Forbes的帮助和时间。

0
0 Comments

问题的出现原因:

该问题的出现是因为需要将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 Dictionary Object { 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,但是这真的很困难。

0