热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用ASP.NETCore反序列化多维JSON数组

我已经尝试了几天才能找到这个问题,也许我遗漏了一些东西。当我基于GitH

我已经尝试了几天才能找到这个问题,也许我遗漏了一些东西。

当我基于GitHub构建示例应用程序时,我遵循了microsoft的建议:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1

不幸的是,这段代码似乎不适用于多维数组。

我的应用程序的希望是从我们的Teamwork Desk帐户获取信息,以便我们可以使用ASP.NET应用程序创建报告。

任何有关如何使此工作正常进行的技巧或想法都很好。

这是我的代码:

文件夹(Models.TeamworkDesk)| Customer.cs

using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace vanilla.Models.TeamworkDesk
{
public class Contact
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("value")]
public string Value { get; set; }
[JsonPropertyName("type")]
public string Type { get; set; }
[JsonPropertyName("isMain")]
public bool IsMain { get; set; }
[JsonPropertyName("createdAt")]
public DateTime CreatedAt { get; set; }
}
public class Customer
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("timezoneId")]
public int TimezoneId { get; set; }
[JsonPropertyName("avatarURL")]
public string AvatarURL { get; set; }
[JsonPropertyName("email")]
public string Email { get; set; }
[JsonPropertyName("contacts")]
public List Contacts { get; set; }
[JsonPropertyName("externalId")]
public string ExternalId { get; set; }
[JsonPropertyName("extraData")]
public string ExtraData { get; set; }
[JsonPropertyName("firstName")]
public string FirstName { get; set; }
[JsonPropertyName("jobTitle")]
public string JobTitle { get; set; }
[JsonPropertyName("language")]
public string Language { get; set; }
[JsonPropertyName("lastName")]
public string LastName { get; set; }
[JsonPropertyName("address")]
public string Address { get; set; }
[JsonPropertyName("mobile")]
public string Mobile { get; set; }
[JsonPropertyName("notes")]
public string Notes { get; set; }
[JsonPropertyName("organization")]
public string Organization { get; set; }
[JsonPropertyName("phone")]
public string Phone { get; set; }
[JsonPropertyName("trusted")]
public bool Trusted { get; set; }
[JsonPropertyName("welcomeEmailSent")]
public bool WelcomeEmailSent { get; set; }
[JsonPropertyName("facebookURL")]
public string FacebookURL { get; set; }
[JsonPropertyName("googlePlusURL")]
public string GooglePlusURL { get; set; }
[JsonPropertyName("linkedinURL")]
public string LinkedinURL { get; set; }
[JsonPropertyName("twitterHandle")]
public string TwitterHandle { get; set; }
[JsonPropertyName("createdAt")]
public DateTime CreatedAt { get; set; }
[JsonPropertyName("createdBy_users_id")]
public int CreatedBy_Users_Id { get; set; }
[JsonPropertyName("updatedAt")]
public DateTime UpdatedAt { get; set; }
[JsonPropertyName("updatedBy_users_id")]
public int UpdatedBy_Users_Id { get; set; }
[JsonPropertyName("company")]
public object Company { get; set; }
[JsonPropertyName("lastTicketDate")]
public DateTime? LastTicketDate { get; set; }
[JsonPropertyName("numTickets")]
public int NumTickets { get; set; }
}
public class RootObject
{
[JsonPropertyName("customers")]
public List Customers { get; set; }
[JsonPropertyName("totalCustomers")]
public int TotalCustomers { get; set; }
}
}

文件夹(页面)| Teamwork.cshtml.cs

using microsoft.AspNetCore.Mvc.RazorPages;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using vanilla.Models.TeamworkDesk;
namespace vanilla.Pages
{
public class TeamworkModel : PageModel
{
private readonly IHttpClientFactory _clientFactory;
public IEnumerable Customers { get; private set; }
public bool getcustomersError { get; private set; }
public TeamworkModel(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task OnGet()
{
var request = new HttpRequestMessage(HttpMethod.Get,"https://vanillacompany.teamwork.com/desk/v1/customers.json");
var client = _clientFactory.Createclient();
var byteArray = Encoding.ASCII.GetBytes("myUniqueKey:");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(byteArray));
var respOnse= await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
using var respOnseStream= await response.Content.ReadAsStreamAsync();
Customers = await JsonSerializer.DeserializeAsync>(responseStream);
}
else
{
getcustomersError = true;
Customers = Array.Empty();
}
}
}
}

文件夹(页面)| Teamwork.cshtml

@page
@model vanilla.Pages.TeamworkModel
@{
ViewData["Title"] = "Teamwork Customers";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
@if (Model.getcustomersError)
{

Unable to get customers from Teamwork. Please try again later.


}
else
{

    @foreach (var customer in Model.Customers)
    {
  • @customer.FirstName

  • }

JSON示例:

{
"customers": [
{
"id": 94572,"timezoneId": 0,"avatarURL": "https://vanillacompany.teamwork.com/desk/images/examples/noPhoto1.png","email": "testytester@vanillacompany.com","contacts": [
{
"id": 44783,"value": "testytester@vanillacompany.com","type": "email","isMain": true,"createdAt": "0001-01-01T00:00:00Z"
}
],"externalId": "","extraData": "","firstName": "Testy","jobTitle": "Code Tester","language": "en","lastName": "Tester","address": "","mobile": "","notes": "","organization": "vanilla","phone": "","trusted": false,"welcomeEmailSent": false,"facebookURL": "","googlePlusURL": "","linkedinURL": "","twitterHandle": "","createdAt": "0001-01-01T00:00:00Z","createdBy_users_id": 166240,"updatedAt": "0001-01-01T00:00:00Z","updatedBy_users_id": 166240,"company": null,"lastTicketDate": null,"numTickets": 11
},{
"id": 85469,"avatarURL": "https://vanillacompany.teamwork.com/desk/images/examples/noPhoto2.png","email": "codebreaker@vanillacompany.com","contacts": [
{
"id": 45002,"value": "codebreaker@vanillacompany.com","firstName": "Code","jobTitle": "","lastName": "Breaker","updatedAt": "2016-05-04T20:46:10Z","lastTicketDate": "2017-03-22T19:24:47Z","numTickets": 5
},{
"id": 69421,"avatarURL": "https://vanillacompany.teamwork.com/desk/images/examples/noPhoto3.png","email": "enduser@vanillacompany.com","contacts": [
{
"id": 45032,"value": "enduser@vanillacompany.com","createdAt": "2016-02-03T18:57:16Z"
}
],"firstName": "End","language": "","lastName": "User","organization": "","phone": "999-777-8888","createdAt": "2016-02-03T18:57:16Z","createdBy_users_id": 015874,"updatedAt": "2016-04-05T16:49:26Z","updatedBy_users_id": 015874,"lastTicketDate": "2016-04-05T16:48:27Z","numTickets": 23
},],"totalCustomers": 1294
}

谢谢。



您的Json很好,您刚刚混合了一些反序列化的目标。使用您现有的代码,我将进行这些更改。

在类RootObject中,将Customers属性更改为List类型:

public List Customers { get; set; }

在Teamwork.cshtml.cs中,将Customers属性更改为RootObject类型:

public RootObject Customers { get; private set; }

然后将反序列化行更改为:

Customers = await JsonSerializer.DeserializeAsync(responseStream);

最后,根据个人喜好,我将RootObject更改为CustomerList之类的名字。


推荐阅读
  • 本文详细探讨了 Android Service 组件中 onStartCommand 方法的四种不同返回值及其应用场景。Service 可以在后台执行长时间的操作,无需提供用户界面,支持通过启动和绑定两种方式创建。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 本文介绍了如何使用 Python 的 Pyglet 库加载并显示图像。Pyglet 是一个用于开发图形用户界面应用的强大工具,特别适用于游戏和多媒体项目。 ... [详细]
  • 本文针对HDU 1042 N! 问题提供详细的解析和代码实现。题目要求计算给定整数N(0 ≤ N ≤ 10000)的阶乘N!。文章不仅提供了算法思路,还附上了C++语言的具体实现。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
author-avatar
xn60ljv
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有