|
สำหรับโค้ดชุดนี้ก็ยังใช้ NewtonSoft เป็นหลักอยู่น่ะครับ แต่ต้องเลือก Net Framework เวอร์ชั่นที่สูงกว่า 4.0 แอดมินเลยใช้ VB2019 แทน VB2010 ... เป็นการดึงเอาข้อมูลหรือที่เรียกว่า API มาจาก สำนักงานพัฒนารัฐบาลดิจิทัล (องค์การมหาชน) (สพร.) ศูนย์กลางการให้บริการข้อมูลเปิดภาครัฐ (Open Government Data) พัฒนาขึ้นภายใต้แนวคิดการเป็นศูนย์กลางในการเข้าถึงข้อมูลเปิดภาครัฐของประเทศที่ให้ประชาชนสามารถเข้าถึงข้อมูลภาครัฐได้สะดวก รวดเร็ว ตลอดเวลา โดยข้อมูลที่เผยแพร่อยู่ในรูปแบบไฟล์ที่สามารถแสดงตัวอย่างข้อมูล (Preview) การแสดงข้อมูลด้วยภาพ (Visualization) และเอพีไอ (API) แบบอัตโนมัติให้กับชุดข้อมูลที่เผยแพร่ได้ รวมทั้งยังสามารถจัดการชุดข้อมูลและเมทาดาตาของข้อมูลได้อีกด้วย ...
แอดมินเลือกข้อมูลโควิด-19 มาใช้งาน โดยจะมีวิธีการอ่านค่าข้อมูลรูปแบบ JSON อยู่ 2 แบบน่ะครับ
อันดับแรกต้องเข้าไปสมัครสมาชิก เพื่อรับ TOKEN มาใช้งานก่อน ...
รายงาน COVID-19 ประจำวัน [covid-19-daily] ... เพื่อรับค่า API
มาดูโค้ดฉบับเต็มกันเถอะ ...
- Imports System.Net
- Imports System.IO
- Imports Newtonsoft.Json
- Imports Newtonsoft.Json.Linq
- '"' Sign Up ... https://opend.data.go.th/register_api/signup.php
- '"' Get API ... https://opend.data.go.th/search_virtuoso/after/index.jsp?language=th&dsname=vir_3277_1584880342
- Public Class frmCovid19Thai
- Dim TOKEN As String = "YOUR TOKEN"
- Private Sub frmCovid19Thai_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- lblCount.Text = ""
- Call Covid19Thailand()
- 'Call Covid19API()
- End Sub
- '// Deserialized JSON and return DataTable.
- Public Function DeserializeDataTable(json As String) As DataTable
- Dim dt As DataTable
- dt = TryCast(JsonConvert.DeserializeObject(json, (GetType(DataTable))), DataTable)
- Return dt
- End Function
- '// It's me.
- Private Sub Covid19Thailand()
- '// All data.
- Dim url As String = "https://opend.data.go.th/opend-search/vir_3277_1584880342/query?dsname=vir_3277_1584880342&path=vir_3277_1584880342&loadAll=1&type=json&offset=0"
- '// Filter "ขอนแก่น"
- 'Dim url = "https://opend.data.go.th/opend-search/vir_3277_1584880342/query?dsname=vir_3277_1584880342&path=vir_3277_1584880342&property=col_6&operator=S_EQUALS&valueLiteral=%E0%B8%82%E0%B8%AD%E0%B8%99%E0%B9%81%E0%B8%81%E0%B9%88%E0%B8%99&loadAll=1&type=json&limit=100&offset=0"
- Dim request As HttpWebRequest
- Dim response As HttpWebResponse = Nothing
- Dim reader As StreamReader
- Try
- request = DirectCast(WebRequest.Create(url), HttpWebRequest)
- request.Method = "GET"
- request.Headers.Add("api-key", TOKEN)
- response = DirectCast(request.GetResponse(), HttpWebResponse)
- reader = New StreamReader(response.GetResponseStream())
- Dim s As String
- s = reader.ReadToEnd
- '// {""numData"":""934"",""data"":[ --> Find first bracket [ from left side.
- Dim FirstBracket As Integer = s.IndexOf("[")
- '// ],""message"":""Success"",""status"":""200""} --> Find first bracket ] from right side.
- Dim LastBracket As Integer = InStrRev(s, ("]"))
- s = Mid(s, FirstBracket + 1, LastBracket - FirstBracket)
- Dim dt As New DataTable
- '// Deserialized
- dt = DeserializeDataTable(s)
- dgvData.DataSource = dt
- Call SetupGridView()
- lblCount.Text = "Total Records: " & dgvData.RowCount
- dt.Dispose()
- reader.Dispose()
- response.Dispose()
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- '// From some people.
- Private Sub Covid19API()
- Dim url As String = "https://opend.data.go.th/opend-search/vir_3277_1584880342/query?dsname=vir_3277_1584880342&path=vir_3277_1584880342&loadAll=1&type=json&offset=0"
- Dim request As HttpWebRequest
- Dim response As HttpWebResponse = Nothing
- Dim reader As StreamReader
- Try
- request = DirectCast(WebRequest.Create(url), HttpWebRequest)
- request.Method = "GET"
- request.Headers.Add("api-key", TOKEN)
- response = DirectCast(request.GetResponse(), HttpWebResponse)
- reader = New StreamReader(response.GetResponseStream())
- Dim s As String
- s = reader.ReadToEnd
- Dim obj As JObject = JsonConvert.DeserializeObject(s)
- Dim ln As JToken = obj("data")
- Dim Corona As dataCovid = JsonConvert.DeserializeObject(Of dataCovid)(s)
- If (ln.GetType() Is GetType(Newtonsoft.Json.Linq.JArray)) Then
- Corona.dataArray = JsonConvert.DeserializeObject(Of List(Of dataJson))(JsonConvert.SerializeObject(ln))
- End If
- '//
- 'If (ln.GetType() Is GetType(Newtonsoft.Json.Linq.JObject)) Then
- 'Corona.dataArray = New List(Of dataJson)
- 'Corona.dataArray.Add(JsonConvert.DeserializeObject(Of dataJson)(JsonConvert.SerializeObject(ln)))
- 'End If
- '//
- Dim dt As New DataTable
- dt.Columns.Add("no", GetType(Integer))
- dt.Columns.Add("age")
- dt.Columns.Add("sex")
- dt.Columns.Add("nation")
- dt.Columns.Add("occ_new")
- dt.Columns.Add("Province")
- dt.Columns.Add("Risk")
- dt.Columns.Add("AnnounceDate", GetType(String))
- For Each covid As dataJson In Corona.dataArray
- If covid IsNot Nothing Then
- Dim dr As DataRow = dt.NewRow()
- dr(0) = covid.no
- dr(1) = covid.age
- dr(2) = covid.sex
- dr(3) = covid.nation
- dr(4) = covid.occ_new
- dr(5) = covid.Province
- dr(6) = covid.Risk
- dr(7) = covid.AnnounceDate
- '// Add row.
- dt.Rows.Add(dr)
- End If
- Next
- dgvData.DataSource = dt
- Call SetupGridView()
- lblCount.Text = "Total Records: " & dgvData.RowCount
- dt.Dispose()
- reader.Dispose()
- response.Dispose()
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- Private Sub SetupGridView()
- With dgvData
- .RowHeadersVisible = False
- .AllowUserToAddRows = False
- .AllowUserToDeleteRows = False
- .AllowUserToResizeRows = False
- .MultiSelect = False
- .SelectionMode = DataGridViewSelectionMode.FullRowSelect
- .ReadOnly = True
- '// Data rows
- .Font = New Font("Tahoma", 10)
- .RowTemplate.MinimumHeight = 27
- .RowTemplate.Height = 27
- '// Column Header
- .ColumnHeadersHeight = 30
- .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
- '// Autosize Column
- .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
- '// Even-Odd Color
- .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue ' Color.LightGreen
- '// Header
- With .ColumnHeadersDefaultCellStyle
- .BackColor = Color.Navy
- .ForeColor = Color.White
- .Font = New Font(dgvData.Font, FontStyle.Bold)
- End With
- '// Hidden
- .Columns(0).Visible = False
- End With
- '//
- 'For i = 0 To dgvData.RowCount - 1
- 'If Mid(dgvData.Rows(i).Cells(2).Value.ToString, 1, 10) <> "2020-02-29" Then
- 'dgvData.Rows(i).Cells(2).Value = Format(CDate(Mid(dgvData.Rows(i).Cells(2).Value.ToString, 1, 10)), "dd/MM/yyyy")
- 'Else
- 'dgvData.Rows(i).Cells(2).Value = "29/02/2020"
- 'End If
- 'Next
- End Sub
- Private Sub frmCovid19Thai_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- Me.Dispose()
- GC.SuppressFinalize(Me)
- Application.Exit()
- End Sub
- Private Sub BtnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click
- Call Covid19Thailand()
- 'Call Covid19API()
- End Sub
- End Class
- Public Class dataCovid
- Public Property dataArray As List(Of dataJson)
- End Class
- Public Class dataJson
- Public Property no As Integer
- Public Property age As String
- Public Property sex As String
- Public Property nation As String
- Public Property occ_new As String
- Public Property Province As String
- Public Property Risk As String
- Public Property AnnounceDate As String
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2019) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|