Обход Nested JSON с использованием VBA - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть JSON Я пытаюсь разобрать в VBA. JSON выглядит примерно так:

{
    "participantEligibilityResults": [
        {
            "eligibilityResult": {
                "participantId": "HSA92a",
                "clientId": "NIRCCCONFIG",
                "environment": "CONFIG",
                "errorReason": null,
                "previousEvent": {
                    "eventDate": "2019-01-01",
                    "eventReason": "7",
                    "eligibilityDetails": [
                        {
                            "standardBenefitAreaId": "SPLIFE",
                            "benefitOptionId": "1XPay",
                            "coverageLevelId": "PPSP",
                            "employeeMonthlyCost": 216.67,
                            "employerMonthlyCost": 0.0,
                            "benefitProgramId": "ProgH"
                        },
                        {
                            "standardBenefitAreaId": "SPLIFE",
                            "benefitOptionId": "NoCoveragePay",
                            "coverageLevelId": null,
                            "employeeMonthlyCost": 0.0,
                            "employerMonthlyCost": 0.0,
                            "benefitProgramId": "ProgH"
                        }
                    ],
                    "dependents": []
                },
                "currentEvent": {
                    "eventDate": "2020-03-14",
                    "eventReason": "5",
                    "eligibilityDetails": [
                        {
                            "standardBenefitAreaId": "BASICCHLIFE",
                            "benefitOptionId": "BCHWaive",
                            "coverageLevelId": null,
                            "employeeMonthlyCost": 0.0,
                            "employerMonthlyCost": 0.0,
                            "benefitProgramId": "ProgH",
                            "beneficiaryCollection": "Not Applicable",
                            "maxCoverageAmount": 0.0,
                            "minCoverageAmount": 0.0,
                            "coverageAmount": 0.0,
                            "preTax": true,
                            "postTax": false,
                            "userDefinedTaxability": false,
                            "numberOfPayPeriods": 52,
                            "payperiodsRemaining": 42.0
                        },
                        {
                            "standardBenefitAreaId": "DENTAL",
                            "benefitOptionId": "DentalPPO",
                            "coverageLevelId": "PPFAM2",
                            "employeeMonthlyCost": 29.17,
                            "employerMonthlyCost": 125.0,
                            "benefitProgramId": "ProgH",
                            "beneficiaryCollection": "Not Applicable",
                            "maxCoverageAmount": 0.0,
                            "minCoverageAmount": 0.0,
                            "preTax": true,
                            "postTax": false,
                            "userDefinedTaxability": false,
                            "numberOfPayPeriods": 52,
                            "payperiodsRemaining": 42.0
                        }
                    ],
                    "dependents": [
                        {
                            "fullName": "Allison Drew ",
                            "dependentId": "5d82c4bf-609d-4c2f-8c1b-7d8fdd8b9fde",
                            "relationshipType": "Spouse",
                            "birthDate": "1980-01-01",
                            "activeIndicator": true,
                            "approvedIndicator": true,
                            "studentIndicator": false,
                            "coverages": [
                                {
                                    "standardBenefitAreaId": "DENTAL",
                                    "benefitOptionId": "NoCoverageDental",
                                    "dependentCoverageRequired": false,
                                    "activeCourtOrdered": false
                                },
                                {
                                    "standardBenefitAreaId": "MEDICAL",
                                    "benefitOptionId": "NoCoverageMedical",
                                    "dependentCoverageRequired": false,
                                    "activeCourtOrdered": false
                                }
                            ]
                        },
                        {
                            "fullName": "Adam Drew ",
                            "dependentId": "d3f97b64-4a50-4dea-bec8-51d3db39352a",
                            "relationshipType": "Child",
                            "birthDate": "2012-01-01",
                            "activeIndicator": true,
                            "approvedIndicator": true,
                            "studentIndicator": false,
                            "coverages": [
                                {
                                    "standardBenefitAreaId": "DENTAL",
                                    "benefitOptionId": "NoCoverageDental",
                                    "dependentCoverageRequired": false,
                                    "activeCourtOrdered": false
                                },
                                {
                                    "standardBenefitAreaId": "MEDICAL",
                                    "benefitOptionId": "NoCoverageMedical",
                                    "dependentCoverageRequired": false,
                                    "activeCourtOrdered": false
                                }
                            ]
                        }
                    ]
                }
            },
            "changes": []
        }
    ]
}

В настоящее время я использую VBA- JSON из https://github.com/VBA-tools/VBA-JSON для анализа JSON.

JsonOptions.AllowUnquotedKeys = True
Set JSON = JsonConverter.ParseJson(jsonResponse)

В конечном счете, я ищу доступ к memberResults | eligibilityResult | currentEvent | eligibilityDetails и memberResults | eligibilityResult | currentEvent | иждивенцы . Я попытался начать обходить JSON, используя что-то вроде:

For Each Eligibility In JSON("participantEligibilityResults")
    For Each Detail In Eligibility("eligibilityResult")
            'DO SOMETHING HERE
        Next
Next

К сожалению, когда я выполняю анализ на уровне memberEligibilityResults, я не могу получить доступ к уровням ниже. Я получаю сообщение об ошибке «Объект не поддерживает это свойство или метод». Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 30 апреля 2020

Все, что заключено в {}, будет выведено в виде словаря, все, что заключено в [], будет коллекцией. Вам просто нужно следовать за вложением, чтобы получить то, что вы хотите.

Sub Test()

    Dim result As String
    Dim Item, a
    Dim parsedResult As Object, obj, node, k

    'loading from a cell for testing...
    Set parsedResult = JsonConverter.ParseJson(Sheet2.Range("A1").Value)

    Set obj = parsedResult("participantEligibilityResults")(1)("eligibilityResult")

    Set node = obj("currentEvent")("eligibilityDetails")(1)
    DumpJSon node 'see below


    Set node = obj("currentEvent")("dependents")(1)
    DumpJSon node 'see below


End Sub

Если есть определенные элементы c, которые вы хотите, то попытка создать вложенные циклы, чтобы добраться до них, вероятно, будет не очень полезна - определить пути, которые вы хотите, и получить доступ к значениям напрямую. Если вам нужно (например) l oop над коллекцией, это должно быть частью вашего подхода.

Иногда полезно перепроверить, что у вас есть в проанализированном результате, так что вы можете использовать это выгрузить его в окно «Немедленно» (целиком или только его части)

Sub DumpJSon(obj, Optional level As Long = 0)
    Const LEVEL_STEP As Long = 5
    Dim k, v, n, s, tmp
    If TypeName(obj) = "Dictionary" Then
        For Each k In obj.keys
            s = String(level, "-") & k & " = "
            If IsObject(obj(k)) Then
                Debug.Print s & IIf(obj(k).Count = 0, "Empty ", "") & _
                           TypeName(obj(k))
                DumpJSon obj(k), level + LEVEL_STEP
            Else
                Debug.Print s & obj(k)
            End If
        Next k
    ElseIf TypeName(obj) = "Collection" Then
        n = 1
        For Each v In obj
            s = String(level, "-") & "(Item #" & n & ") "
            If IsObject(v) Then
                Debug.Print s & IIf(v.Count = 0, "Empty ", "") & _
                            TypeName(v)
                DumpJSon v, level + LEVEL_STEP
            Else
                Debug.Print s & v
            End If
            n = n + 1
        Next v
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...