Анализ данных переменной JSON из вывода Pyomo

#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. Это работает отлично. Большое спасибо, Тим.