热门标签 | 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之类的名字。


推荐阅读
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
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社区 版权所有