DataGridView를 채우기 위해 JSON 파일을 DataTable로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

Mattia

DataGridView의 데이터 소스로 사용되는 BindingSource에 연결된 DataTable의 값을 저장하고 싶습니다. 내가 사용중인 코드는 이 게시물 에서 가져온 것입니다.

DataTable을 JSON으로 직렬화하고 Form.FormClosing이벤트 에서 다음 코드를 사용하여 텍스트 파일에 저장했습니다 .

Dim path As String = "C:\Users\Mattia\Desktop\json.txt"   

Private Sub form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    Dim json As String = JsonConvert.SerializeObject(binanceData, Formatting.Indented)
    File.WriteAllText(path, JsonConvert.SerializeObject(json, Newtonsoft.Json.Formatting.Indented))
End Sub

불행히도 내가 들어가는 JSON 문자열 file.txt은 다음과 같습니다.

"[\ r \ n {\ r \ n"색인 ": 1, \ r \ n"날짜 ":"2021-03-18T08 : 44 : 43 ", \ r \ n"쌍 ":"DOGE / EUR " , \ r \ n "유형": "한도", \ r \ n "측면": "구매", \ r \ n "평균": 0.04815, \ r \ n "가격": 0.04815, \ r \ n " 실행 됨 ": 30526.0, \ r \ n"금액 ": 30526.0, \ r \ n"총계 ": 1469.82690 \ r \ n}, \ r \ n {\ r \ n"인덱스 ": 2, \ r \ n" 날짜 ":"2021-03-18T08 : 44 : 43 ", \ r \ n"쌍 ":"DOGE / EUR ", \ r \ n"유형 ":"제한 ", \ r \ n"측면 ":" 구매 ", \ r \ n"평균 ": 0.04815, \ r \ n"가격 ": 0.04815, \ r \ n"실행 됨 ": 30526.0, \ r \ n"금액 ": 30526.0, \ r \ n"총계 " : 1469.82690 \ r \ n} \ r \ n] "

유효한 JSON 형식이 아닙니다.
이 때문에 DataTable에 대한 JSON 역 직렬화가 작동하지 않습니다.

에서 Form.Loadi를 JSON을 역 직렬화하는이 코드를 사용 :

binanceData = TryCast(JsonConvert.DeserializeObject(path, (GetType(DataTable))), DataTable)

이로 인해 예외가 발생합니다.

Newtonsoft.Json.JsonReaderException : '값을 구문 분석하는 동안 예기치 않은 문자가 발생했습니다 : C. 경로' ', 줄 0, 위치 0.'

제안 사항이 있습니까? 감사

편집 :
이제 텍스트 파일에서 얻는 JSON 형식은 다음과 같습니다.

[
  {
    "Index": 1,
    "Date": "2021-03-18T08:44:43",
    "Pair": "DOGE/EUR",
    "Type": "Limit",
    "Side": "Buy",
    "Average": 0.04815,
    "Price": 0.04815,
    "Executed": 30526.0,
    "Amount": 30526.0,
    "Total": 1469.82690
  }
]
지미
  • DataGridView에 붙여 넣은 데이터를 JSON 파일로 직렬화해야합니다.
  • DataGridView의 데이터 소스는 DataTable입니다.

Json.Net 시리얼은 수, 좀 덜, 잘 디시리얼라이저를이 처리 할 수 잘못 해석 이 경우 부동 소수점 값은 다음과 같이 읽기, 유형의 일부를 Double대신 Decimal. Integer는 일반적으로 Long대신 으로 처리 됩니다.

큰 문제는 아니지만 DataTable의 자동 인덱서를 Type으로 변경 Long하고 JsonSerializerSettings 를 사용하여 부동 소수점 값을 Decimal, setting 으로 처리해야 을 지정할 수 있습니다 FloatParseHandling = FloatParseHandling.Decimal.

남은 일은 JSON 파일에 데이터가 포함되어 있지 않을 때 현재 DataTable 개체를 파괴하지 않도록 코드 지시 하는 것입니다.
먼저 JSON 파일이 존재하는지 확인해야합니다.

확실히 쓰기 액세스 권한이있는 경로에 JSON 파일을 저장하는 것이 좋습니다. WinForms 앱이 있으므로 Application.CommonAppDataPath가 반환 한 경로 일 수 있습니다 .
이 경로는 다음 위치에서 애플리케이션 용으로 예약 된 폴더를 가리 킵니다.

[Drive]:\ProgramData\[ApplicationName]\[ApplicationVersion]

항상이 경로에서 읽고 쓸 수 있습니다.

JSON 파일 경로를 지정하는 필드를 추가해 보겠습니다.

Private jsonPath As String = Path.Combine(Application.CommonAppDataPath, "BinanceData.json")

Form이 초기화되면 DataTable 개체를 만들고 해당 열의 유형을 정의하는 프로 시저를 실행합니다.
JSON 파일이 있고 데이터가 포함 된 경우 JSON을 DataTable로 역 직렬화하고 BindingSource에 연결된 DataGridView 컨트롤을 바인딩하는 데 사용되는 DataTable 필드로 설정합니다.
그렇지 않으면 스키마 만 포함하는 빈 DataTable을 설정합니다.

Json.Net 12.0.3 이상 필요

전체 절차는 여기에 설명되어 있습니다.
클립 보드의 텍스트를 DataGridView로 분할하는 방법

Imports System.ComponentModel
Imports System.Data
Imports System.Globalization
Imports System.IO
Imports Newtonsoft.Json

Public Class SomeForm

    Private binanceSource As BindingSource = Nothing
    Private binanceData As DataTable = Nothing
    Private jsonPath As String = 
        Path.Combine(Application.CommonAppDataPath, "BinanceData.json")

    Public Sub New()
        InitializeComponent()
        ' [...]
        InitializeDataSource()
        InitializeBinanceUI()
    End Sub

    Private Sub InitializeDataSource()
        If File.Exists(jsonPath) Then
            Dim settings = New JsonSerializerSettings() With {
                .FloatParseHandling = FloatParseHandling.Decimal
            }
            Dim json = File.ReadAllText(jsonPath)
            Dim dt = JsonConvert.DeserializeObject(Of DataTable)(json, settings)
            If dt IsNot Nothing AndAlso dt.Columns.Count > 0 Then
                dt.Columns("Index").AutoIncrement = True
                dt.Columns("Index").AutoIncrementSeed = CType(dt.Rows(dt.Rows.Count - 1)("Index"), Long) + 1
                dt.Columns("Index").AutoIncrementStep = 1
                binanceData = dt
                Return
            End If
        End If

        binanceData = New DataTable("BinanceData")
        binanceData.Columns.Add(New DataColumn() With {
            .DataType = GetType(Long),
            .ColumnName = "Index",
            .AutoIncrement = True,
            .AutoIncrementSeed = 1,
            .AutoIncrementStep = 1
        })

        binanceData.Columns.Add("Date", GetType(Date))
        binanceData.Columns.Add("Pair", GetType(String))
        binanceData.Columns.Add("Type", GetType(String))
        binanceData.Columns.Add("Side", GetType(String))

        binanceData.Columns.Add("Average", GetType(Decimal))
        binanceData.Columns.Add("Price", GetType(Decimal))
        binanceData.Columns.Add("Executed", GetType(Decimal))
        binanceData.Columns.Add("Amount", GetType(Decimal))
        binanceData.Columns.Add("Total", GetType(Decimal))
    End Sub

    Private Sub InitializeBinanceUI()
        AddHandler dgvBinance.CellFormatting, AddressOf dgvBinanceCellFormatting
        binanceSource = New BindingSource(binanceData, "")
        dgvBinance.DataSource = binanceSource
        dgvBinance.Columns("Date").DefaultCellStyle.Format = "MM-dd H:mm:ss"
        dgvBinance.Columns("Average").DefaultCellStyle.Format = "N5"
        dgvBinance.Columns("Price").DefaultCellStyle.Format = "N5"
        dgvBinance.Columns("Executed").DefaultCellStyle.Format = "N1"
        dgvBinance.Columns("Amount").DefaultCellStyle.Format = "N1"
        dgvBinance.Columns("Total").DefaultCellStyle.Format = "N5"
    End Sub
End Sub

Form이 닫히면 데이터를 JSON 파일에 저장하고 DataTable 콘텐츠를 직렬화 SerializeBinanceDataTable()하고 FormClosing핸들러 에서 메서드를 호출 합니다. 물론 필요한 경우 다른 경우에이 메서드를 호출 할 수 있습니다.

Private Sub SomeForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    SerializeBinanceDataTable()
End Sub

Private Sub SerializeBinanceDataTable()
    Dim json As String = JsonConvert.SerializeObject(binanceData, Formatting.Indented)
    File.WriteAllText(jsonPath, json)
End Sub

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관