iT邦幫忙

1

如何解析Json回應轉化成數據集

  • 分享至 

  • xImage

Json回應如下:

{
"Status": "1",
"Result": {
"Response": "Ok",
"TotalRecord": 2
},
"List": [
        {
            "ID": "1",
            "Name": "Karen",
            "PhoneNo": "0010000114248"
        },
        {
            "ID": "2",
            "Name": "Krystal",
            "PhoneNo": "0010000114250"
        }
    ]
}

代碼如下:

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Net
Imports Newtonsoft.Json
Imports System.IO
Imports System.Web.Script.Serialization
Imports Newtonsoft.Json.Linq

<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class test
    Inherits System.Web.Services.WebService
    
    <WebMethod> _
    Public Function Post()
            Dim apiUrl = ConfigurationManager.AppSettings("http://192.XX.XXX.XX/api/Update")
            Dim request As WebRequest = WebRequest.Create(apiUrl)
            Dim body = "{""PageIndex"": ""1"", ""PageSize"": ""10000""}"
            Dim byteArray As Byte() = Encoding.UTF8.GetBytes(body)
            request.Method = "POST"
            request.ContentType = "application/json"
            request.ContentLength = byteArray.Length
            Dim dataStream As Stream = request.GetRequestStream()
            dataStream.Write(byteArray, 0, byteArray.Length)
            dataStream.Close()
            Dim sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream)
            Dim rte As String = sr.ReadToEnd()
            Dim jsonObject As JObject = JObject.Parse(rte)
            Dim id = If(jsonObject.SelectToken("List")(0)("ID") Is Nothing, "", jsonObject.SelectToken("List")(0)("ID").ToString)
            Dim name = If(jsonObject.SelectToken("List")(0)("Name") Is Nothing, "", jsonObject.SelectToken("List")(0)("Name").ToString)
            Dim phoneNo = If(jsonObject.SelectToken("List")(0)("PhoneNo") Is Nothing, "", jsonObject.SelectToken("List")(0)("PhoneNo").ToString)
            Dim dt As DataTable = New DataTable("Result")
            dt.Columns.Add("id")
            dt.Columns.Add("name")
            dt.Columns.Add("phoneNo")
            
            dt.Rows.Add(id, name, phoneNo)
            Dim ds As DataSet = New DataSet("Result")
            ds.Tables.Add(dt)
            Return ds.GetXml()
End Function

當我嘗試這段代碼時,它成功轉換為數據集,但是它只返回一條記錄, 我也無法獲取Json回應中的第二條記錄,而且如果我有超過 10000 條記錄,我如何才能獲得數據集中的許多記錄.求大大解答謝謝

看更多先前的討論...收起先前的討論...
天黑 iT邦研究生 5 級 ‧ 2023-07-10 16:22:40 檢舉
也許你可以參考 五年前的問題文章 https://ithelp.ithome.com.tw/questions/10188645
PPTaiwan iT邦好手 1 級 ‧ 2023-07-10 16:52:29 檢舉
用什麼 DB ,我記得 MYSQL與Oracle 都有支援 json 的應用
reborn iT邦新手 5 級 ‧ 2023-07-10 16:53:59 檢舉
@天黑 好的,我看看,謝謝
reborn iT邦新手 5 級 ‧ 2023-07-10 16:54:23 檢舉
@PPTaiwan 我用 sql server
obarisk iT邦研究生 1 級 ‧ 2023-07-11 06:30:02 檢舉
tsql 也有 json query。

端看你想在取得資料時解析
從資料庫查詢時解析
sam0407 iT邦大師 1 級 ‧ 2023-07-13 09:30:36 檢舉
SQL Server很久以前就有支援XML了,json怎麼可能不支援?
微軟文件請參考:
https://learn.microsoft.com/zh-tw/sql/relational-databases/json/json-data-sql-server?view=sql-server-ver16
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
純真的人
iT邦大師 1 級 ‧ 2023-07-11 10:09:52
最佳解答

我看你有安裝這個Json~那你應該可以跟我用一樣的方式~
Imports Newtonsoft.Json

下面程式碼是抓Json這段出來解析跑陣列

[
 {
  "ID":"1",
  "Name":"Karen",
  "PhoneNo":"0010000114248"
 },
 {
  "ID":"2",
  "Name":"Krystal",
  "PhoneNo":"0010000114250"
 }
]
'先抓第一層的List陣列字串
Dim Obj As Newtonsoft.Json.Linq.JObject = Newtonsoft.Json.Linq.JObject.Parse(rte)
Dim ListArray As String = Newtonsoft.Json.JsonConvert.SerializeObject(Obj.Item("List"))

'建立新的空白DataTable
Dim dt As System.Data.DataTable = New System.Data.DataTable("Result")
dt.Columns.Add("id")
dt.Columns.Add("name")
dt.Columns.Add("phoneNo")

'將陣列字串丟到迴圈紀錄到DataTable
Dim jsonObject As Newtonsoft.Json.Linq.JArray = Newtonsoft.Json.Linq.JArray.Parse(ListArray)
For j = 0 To jsonObject.Count - 1
    Dim id As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(jsonObject(j).Item("ID")), """", "")
    Dim name As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(jsonObject(j).Item("name")), """", "")
    Dim phoneNo As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(jsonObject(j).Item("phoneNo")), """", "")

    dt.Rows.Add(id, name, phoneNo)
    
Next

'再把DataTable紀錄到DataSet顯示
Dim ds As System.Data.DataSet = New System.Data.DataSet("Result")
ds.Tables.Add(dt)
reborn iT邦新手 5 級 ‧ 2023-07-11 11:53:26 檢舉

純真的人請問我應該返回什麼才能獲得資料,因為我使用斷點,它顯示數據已正確循環資料或者如何將此這些資料寫入sql server數據庫表中?

因為是Json擷取指定陣列資料~
我是用組合SQL字串(insert into)組合好後~寫入資料庫~@@

reborn iT邦新手 5 級 ‧ 2023-07-11 14:53:16 檢舉

感謝大大,懂了

0
japhenchen
iT邦超人 1 級 ‧ 2023-07-11 07:34:12

1,把你的JSON轉成CLASS
https://jsonutils.com/

  Public Class Result
        Public Property Response As String
        Public Property TotalRecord As Integer
    End Class

    Public Class List
        Public Property ID As String
        Public Property Name As String
        Public Property PhoneNo As String
    End Class

    Public Class Example
        Public Property Status As String
        Public Property Result As Result
        Public Property List As List()
    End Class

2、到nuget 安裝newtonsoft.json
3、把你的json字串,用

    Dim newObject as Example = newtonsoft.jsonConvert.deserialize<Example>(strYourJSON)
    ' 然後你要的就是 
    print( newObject.Result.Response ) ' OK 

你再寫程式去把這個 newObject 裡的東西,塞回資料庫就得了

reborn iT邦新手 5 級 ‧ 2023-07-11 11:25:41 檢舉

我使用Function來進行轉換, print不了

你的function處理了什麼?json轉資料?

reborn iT邦新手 5 級 ‧ 2023-07-13 10:11:57 檢舉

對,json轉資料

0
allenlwh
iT邦高手 1 級 ‧ 2023-07-11 09:31:29
reborn iT邦新手 5 級 ‧ 2023-07-11 11:54:01 檢舉

我使用 Visual Studio 來編寫代碼

我要發表回答

立即登入回答