【问题标题】:Return JSON from API method从 API 方法返回 JSON
【发布时间】:2019-06-06 22:13:29
【问题描述】:

我在这里使用 ASP.net Core web api (c#)

我有一个 JSON 字符串:

{
   "userId":321,   
   "account":"new  
   "fname":"Adam",
   "lname":"Silver" 
   "features":[
      {
         "available":true,
         "status":open,
         "admin":false        
      }
   ]
}

我想在我的 Angular 代码中测试这些数据,所以想将它硬编码到我的 API 中;然后我希望我的 API 将其返回。我发现很难的是如何退货。我应该把它作为一个字符串返回还是需要解析它?

我的 API 中有这个方法:

[HttpGet]        
public ActionResult<IEnumerable<string>> Get()
{
     return new string[] { "value1", "value2" };
}

我需要将它表示成字符串还是以某种方式解析它?

【问题讨论】:

  • 你为什么很难从问题中弄清楚你面临的问题是什么
  • 没有“JSON”这样的东西。 JSON 是一种用于通过网络发送数据的文本格式。您要么有一个对象,要么有一个字符串。如果您有对象,请使用return Json(obj)。如果您有字符串,请将内容类型标头设置为“application/json”。
  • 对不起,我正在使用 asp.net core web api,然后使用 angular 作为前端来使用它。像上面的默认 api 是返回 value1 和 value2。我想知道如何格式化我上面的 json 以同样的方式返回。
  • 创建一个类结构,代表您要返回的 JSON 结构。然后创建该类的实例,并从您的操作方法中返回它。更改方法的返回类型以匹配您返回的内容。
  • 梅森是对的。忘记直接在 Web API 中创建 JSON。创建一个具有正确结构的对象,然后返回它。 Web API 会自动为您将其序列化为 JSON。

标签: c# json asp.net-core-webapi


【解决方案1】:

您的 JSON 无效。我们需要纠正它。 JSONLint 可以对此有所帮助。我拿走了你的 JSON 并纠正了语法错误,直到我得到这个:

{
   "userId": 321,   
   "account": "new",
   "fname": "Adam",
   "lname": "Silver",
   "features":[
      {
         "available": true,
         "status": "open",
         "admin": false        
      }
   ]
}

然后我需要生成一个 C# 类结构来表示这个 JSON。我可以手动创建它,但优秀的json2csharp.com 可以快速为我生成它。我将此 JSON 输入并收到以下类:

public class Feature
{
    public bool available { get; set; }
    public string status { get; set; }
    public bool admin { get; set; }
}

public class RootObject
{
    public int userId { get; set; }
    public string account { get; set; }
    public string fname { get; set; }
    public string lname { get; set; }
    public List<Feature> features { get; set; }
}

我将这些类定义放入我的应用程序中。然后我需要修改我的操作方法来创建这个 RootObject 类的实例(你应该更改名称以实际匹配它的用途)。

[HttpGet]        
public ActionResult<RootObject> Get()
{
    // Create an instance of our RootObject and set the properties
    var myRootObject = new RootObject();
    myRootObject.userId = 321;
    myRootObject.account = "new";
    myRootObject.fname = "Adam";
    myRootObject.lname = "Silver";
    myRootObject.features = new List<Feature>();

    // Create an instance of a feature and set its properties
    var feature = new Feature();
    feature.available = true;
    feature.status = "open";
    feature.admin = false;

    // Add the new feature to the features collection of our RootObject    
    myRootObject.features.Add(feature);

    // Return the instance of our RootObject
    // The framework will handle serializing it to JSON for us
    return myRootObject;
}

请注意,我更改了您方法的签名。我让它不再接受 IEnumerable ,因为不清楚你为什么要这样做。在检查了 Microsoft 的 documentation 后,我将其更改为返回 ActionResult。

【讨论】:

    【解决方案2】:

    您好,请为上述格式找到正确的 JSON 格式:

    {
        "userId": 321,
        "account": "new",
        "fname": "Adam",
        "lname": "Silver",
        "features": [{
            "available": true,
            "status": "open",
            "admin": false
        }]
    }
    

    您可以在 Web API 中使用以下类来传递相应的数据

    public class Feature
    {
        public bool available { get; set; }
        public string status { get; set; }
        public bool admin { get; set; }
    }
    
    public class RootObject
    {
        public int userId { get; set; }
        public string account { get; set; }
        public string fname { get; set; }
        public string lname { get; set; }
        public List<Feature> features { get; set; }
    }
    

    然后在最后,在返回数据时,通过将相应的类对象序列化为 JSON 格式,将相应的类对象转换为 JSON。

    希望它能满足您的要求。

    【讨论】:

    • 它将如何以我的json格式在serilaize中返回/返回
    • @karen 您将创建 RootObject 的一个实例,然后从您的操作方法中返回该实例。该框架为您处理序列化。
    • 我应该在哪里给这个赋值。
    • 在帮助某人时,您不应假设他们有权访问您的自定义源代码。此外,将 void 作为操作方法的返回类型是没有意义的。并且没有理由生成 WebRequest .....
    • @karen,您还需要创建public List&lt;Feature&gt; features { get; set; } 的实例。
    【解决方案3】:

    将 cmets 放入答案中: 如果您使用的是 ActionResult,我假设您使用的是 asp.net mvc。你想要的是 JsonResult。

        [HttpGet]
        public JsonResult Get()
        {
            return new JsonResult
            {
                Data = new
                {
                    userId = 321,
                    account = new
                    {
                        fname = "Adam",
                        lname = "Silver",
                        features = new object[]{
                        new
                    {
                        available = true,
                        status = "open",
                        admin = false
                    }
                    }
                    }
                },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        }
    

    【讨论】:

    • 不,原来是 ASP.NET Core Web API,确实有一个ActionResult
    • 我特地推迟了回答,直到我确定正在使用什么框架。如果问题不清楚,请等到清楚后再尝试回答。如果您有足够的声誉可以发表评论,那么您可以与提问者合作以获得所需的任何澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2021-10-22
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多