#json #vba
#json #vba
Вопрос:
Я написал модель Python / Pyomo, которая выдает файл json, выдержка из которого приведена ниже:
> { "Problem": [
> {
> "Lower bound": 2923356.2144,
> "Name": "unknown",
> "Number of constraints": 4487,
> "Number of nonzeros": 8579,
> "Number of objectives": 1,
> "Number of variables": 3455,
> "Sense": "minimize",
> "Upper bound": 2923356.2144
> } ], "Solution": [
> {
> "number of solutions": 1,
> "number of solutions displayed": 1
> },
> {
> "Constraint": "No values",
> "Gap": 0.0,
> "Message": null,
> "Objective": {
> "obj": {
> "Value": 2923356.2144
> }
> },
> "Problem": {},
> "Status": "feasible",
> "Variable": {
> "CapacityFactor[Coal1,16]": {
> "Value": 0.0899674999999999
> },
> "CapacityFactor[Coal1,17]": {
> "Value": 0.537404375
> },
> "CapacityFactor[Coal1,18]": {
> "Value": 0.537404375
> },
> "CapacityFactor[Coal1,19]": {
> "Value": 0.582716875
> },
> "CapacityFactor[Coal1,20]": {
> "Value": 0.2049675
> },
> "CapacityFactor[Coal2,10]": {
> "Value": 0.87062375
> },
> "CapacityFactor[Coal2,11]": {
> "Value": 0.82999875
> },
> "CapacityFactor[Coal2,12]": {
> "Value": 0.81687375
> },
Я хочу извлечь все «переменные» данные из файла json, чтобы я мог манипулировать этим в Excel, Tableau и т. Д. Я написал некоторый код VBA, используя JsonConverter (https://github.com/VBA-tools/VBA-JSON ), чтобы попытаться сделать это:
Sub jsonConversion()
Dim FSO As New FileSystemObject
Dim JsonTS As TextStream
Dim JsonText As String
Dim Parsed As Dictionary
Dim NumberOfVariables As Integer
Set JsonTS = FSO.OpenTextFile("c:userss_d_nOneDrive - KuunganaModellingKEMSOptimisationResults_20210110.json", ForReading)
JsonText = JsonTS.ReadAll
JsonTS.Close
Set Parsed = JsonConverter.ParseJson(JsonText)
NumberOfVariables = Parsed("Solution")(2)("Variable").Count
Dim Variable As Variant
ReDim Variable(1 To NumberOfVariables) As Variant
Dim i As Integer
Dim VariableDescription As String
For i = 1 To NumberOfVariables
VariableDescription = "CapacityFactor[Coal1,16]"
Variable(i) = Parsed("Solution")(2)("Variable")(VariableDescription)
Next
Этот код, похоже, работает до последнего раздела. У меня есть два вопроса:
- Последняя строка кода «Переменная (i) … и т.д.», похоже, считывает «пустое» значение. Я не уверен, почему.
- Как только я это выясню, я захочу прочитать имя ключа для каждой переменной, то есть найти «VariableDescription». Я тоже не уверен, как это сделать ?!
Прошу прощения, если я упускаю что-то простое — я не использую эти языки изо дня в день и не претендую на звание эксперта!! Заранее большое спасибо за вашу помощь.
Ответ №1:
Итерация ключа и значений словаря выглядит примерно так:
Dim s, k, d
Set s = Parsed("Solution")(2)("Variable")
For Each k in s
Set d = s(k) 'inner dictionary object as value
Debug.Print k, d("Value") 'CapacityFactor[Coal1,16] 0.0899674999999999 etc...
Next k
Комментарии:
1. Большое спасибо, Тим. Я реализовал это и настроил несколько часов в VBA, чтобы проверить, что происходит. Я вижу, что часть ‘k’ работает, то есть код подбирает ключи. Но часть ‘s (k)’ не работает; это вызывает «ошибку времени выполнения 450: неправильный номер аргумента или недопустимое присвоение свойства». Такое чувство, что я очень близок — извиняюсь, если я упускаю что-то очевидное!
2. Извините, я пропустил вложенный объект словаря, который переносит
Variable
значения. Отредактировал мой ответ.3. Это работает отлично. Большое спасибо, Тим.