繁体   English   中英

如何在C#(。net核心)中将对象数组转换为JSON对象

[英]How Do I convert my array of objects into JSON object in C# (.net core)

我正在使用MVC模式在.Net Core 2.2中工作。 我有一个Web-API控制器,在其中使用经典的CRUD方法创建了一些端点。

现在,所有内容都可以编译,并且在调试解决方案时,我得到一个包含几个JSON格式对象的数组-但是系统将其输出视为数组,而不是JSON。

现在,我希望此数组成为JSON。

我已经看过了: https : //www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JObject.htm

我的原始方法如下所示(在控制器中):

[HttpGet("/ListAllItems")]
public async Task<IEnumerable<DtoModel>> ListAllItemsFromDb()
{
    return  await _dbProvider.ListAllItemsAsync();
}

并给出了以下输出:

[{"id": "GUID-STRING", "itemName": "foo"}, {"id": "GUID-STRING2", "itemName": "bar"}]

//My frontend did not recognize this as a JSON, since it is an array, and threw an exception

所以我在控制器中尝试了这个

  [HttpGet("/ListAllItems")]
        public async Task<JObject> ListAllItemsFromDb()
        {
            var result = await _dbProvider.ListAllItemsAsync();
            string output = result.ToString(); 
            string json = JsonConvert.SerializeObject(output);
            JObject obj = JObject.Parse(json);
            return obj; 
        }

当我运行此代码时,我的错误消息指出:“ JsonReaderException:从JsonReader读取JObject时出错。当前的JsonReader项不是对象:字符串。路径,第1行,位置60。”

如何将对象数组转换为JSON对象?

您的前端可能会拒绝JSON数组,因为它们存在一些安全问题。 微妙的JSON漏洞剖析一文对此进行了解释。 但我认为它不再适用,请参阅以及堆栈溢出问题

但是,您可以创建包装器对象,以避免返回顶级JSON数组:

public class Wrapper<T> {
   public T Data {get; set;}
}

然后在您的控制器中:

[HttpGet("/ListAllItems")]
public async Task<Wrapper<IEnumerable<DtoModel>>> ListAllItemsFromDb()
{
    return new Wrapper<<IEnumerable<DtoModel>>() {
       Data = await _dbProvider.ListAllItemsAsync()
    };
}

MVC基础结构将返回JSON结果,如下所示:

{
   Value: [{"id": "GUID-STRING", "itemName": "foo"}, {"id": "GUID-STRING2", "itemName": "bar"}]
}

这应该使您的前端感到高兴。

JsonConvert将毫无问题地转换您的列表-在IEnumerable<DtoObject>上调用ToString()可能是您的问题。

将列表传递给JsonConvert,它将正确解析。

var result = await _dbProvider.ListAllItemsAsync();
string json = JsonConvert.SerializeObject(result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM