Примечание: у этого вопроса есть продолжение здесь:
Копировать выбранные строки флажков из DGV в DGV2, включая столбец изображения
Вам необходимо загрузить изображения после десериализации JSON
в объект вашего класса. Вы можете добавить новое открытое свойство Type Bitmap во внутренний класс Result
, который будет использоваться для представления изображения, на которое ссылается URI, найденный в JSON.
Чтобы aquire Изображения, вам нужен метод, который берет URI ресурса и загружает его с удаленного компьютера. Я добавил открытый метод в класс Products
, который ссылается на все объекты, содержащие ссылку на URI:
после успешного анализа JSON
свойство Results
будет ссылаться на все классы Result
. Каждый класс Result
будет ссылаться на битовый URI в свойстве ProductImage
.
Используя класс WebClient
, мы можем использовать эти ссылки для загрузки изображений и добавления их в свойство типа Bitmap.
Нам также нужно указать парсеру JSON
игнорировать это свойство, поскольку оно не является частью объекта JSON
.
Это можно сделать, добавив атрибут <JsonIgnore>
к свойству.
Переименуйте RootObject
(в вашем определении класса JSON
) в Root
:
Кроме того, все отображаемые здесь классы добавляются в родительский класс.
с именем ProductsQuery
, используется в качестве контейнера для всех объектов класса.
Public Class Root
Public Property uk As Uk
End Class
Десериализовать JSON с помощью JsonConvert.DeserializeObject
:
Dim JSONObject As String = File.ReadAllText("[Source Txt]")
Dim JsonPost As ProductsQuery.Root = JsonConvert.DeserializeObject(Of ProductsQuery.Root)(JSONObject)
Используйте недавно добавленный публичный метод для загрузки изображений:
JsonPost.uk.ghs.Products.LoadImages()
Подготовьте DataGridViewImageColumn , который покажет изображения:
Редактировать : также вставить DataGridViewCheckBoxColumn
.
Dim DGVCheckBoxCol As DataGridViewCheckBoxColumn = New DataGridViewCheckBoxColumn(False) With {
.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader,
.DisplayIndex = 0,
.HeaderText = "",
.Name = "Select"
}
Dim DGVImageCol As DataGridViewImageColumn = New DataGridViewImageColumn(False) With {
.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader,
.DataPropertyName = "Image",
.DisplayIndex = 1,
.FillWeight = 1,
.HeaderText = "Image",
.ImageLayout = DataGridViewImageCellLayout.Normal,
.Name = "Image",
.ValuesAreIcons = False
}
Затем установите DataGridView DataSource
и скройте столбец, содержащий URI-код изображения, который здесь не очень полезен. Кроме того, вызовите метод AutoResizeRows , чтобы установить размер строк для лучшего представления изображения:
DataGridView1.DataSource = Nothing
DataGridView1.Columns.Clear()
DataGridView1.Columns.Insert(0, DGVCheckBoxCol)
DataGridView1.Columns.Insert(1, DGVImageCol)
DataGridView1.DataSource = JsonPost.uk.ghs.Products.Results
DataGridView1.Columns(2).Visible = False
DataGridView1.AutoResizeRows()
Результат :
Модифицированные классы :
Примечание :
Свойство description
представляет собой массив строк, которые DGV отказывается показывать как есть. Я назвал его RawDescription
и добавил новое свойство (Description
) типа String - с атрибутом <JsonIgnore>
- в Result
класс, который будет содержать сплющенную строку.
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Public Class ProductsQuery
Public Class Root
Public Property uk As Uk
End Class
Public Class Uk
Public Property ghs As Ghs
End Class
Public Class Ghs
Public Property products As Products
End Class
Public Class Products
Public Property input_query As String
Public Property output_query As String
Public Property filters As Filters
Public Property queryPhase As String
Public Property totals As Totals
Public Property config As String
<JsonProperty("results")>
Public Property Results As Result()
Public Property suggestions As Object()
Public Sub LoadImages()
Using client As WebClient = New WebClient()
For Each result As Result In Results
Dim bitmapBytes = client.DownloadData(result.ProductImage)
Using ms As MemoryStream = New MemoryStream(bitmapBytes)
ms.Position = 0
result.Image = CType(Image.FromStream(ms).Clone(), Bitmap)
End Using
result.ProductDescription = result.RawDescription(0)
Next
End Using
End Sub
End Class
Public Class Filters
End Class
Public Class Totals
Public Property all As Integer
<JsonProperty("new")>
Public Property NewProducts As Integer
Public Property offer As Integer
End Class
Public Class Result
<JsonIgnore>
Public Property Image As Bitmap
<JsonProperty("image")>
Public Property ProductImage As String
<JsonProperty("superDepartment")>
Public Property SuperDepartment As String
Public Property tpnb As Integer
Public Property ContentsMeasureType As String
<JsonProperty("name")>
Public Property Name As String
Public Property UnitOfSale As Integer
<JsonIgnore>
Public Property Description As String
<JsonProperty("description")>
Public Property RawDescription As String()
Public Property AverageSellingUnitWeight As Double
Public Property UnitQuantity As String
Public Property id As Integer
Public Property ContentsQuantity As Double
<JsonProperty("department")>
Public Property Department As String
<JsonProperty("price")>
Public Property Price As Double
<JsonProperty("unitprice")>
Public Property Unitprice As Double
End Class
End Class