SlideShare una empresa de Scribd logo
1 de 12
Javascript like objects and JSON
processing in VBA
cJobject primer from Excel Liberation
Excel Liberation for details
cJobject purpose
The Excel/VBA model is
optimized for 2 dimensions
(rows/columns) – or at best 3
(sheets/rows/columns)
{
"Flintstone Characters": {
"families": [
{
"family": {
"name": "FlintStone",
"wife": "Wilma",
"husband": "Fred",
"kids": [
"Pebbles"
],
"pets": [
"Baby Puss",
"Dino",
"Doozy"
]
}
},
{
"family": {
"name": "Rubble",
"wife": "Betty",
"husband": "Barney",
"kids": [
"Bam Bam"
],
"pets": [
"Hoppy"
]
}
}
]
}
}
Data from web sources can be
any depth. VBA lacked the
capability to deal with either
the format or the structure of
JSON data. cJobject provides
both the structure and data
handling capability
Excel Liberation for details
Javascript object versus cJobject
VBA lacks the syntax to express such an object as
concisely as javascript,but a similar capability can be
achieved with cJobjectAction javaScript cJobject
New object var job = {}; Set job = new cJobect
Create from JSON var job = JSON.parse(str); Set job = JSONParse(str)
Add a property job["Flintstone Characters”] = null; job.add ("Flintstone Characters”)
Add an array var f = job["Flintstone Characters”]
={families:[]};
Set f = job.child("Flintstone
Characters").add("families").addArr
ay
Add an array element
object
f.push({family:{name:”Flintstone”,wi
fe:”Wilma”,husband:”Fred”});
With f.add.add("family")
.add "name", "FlintStone"
.add "wife", "Wilma"
.add "husband", "Fred“
End with
Convert to JSON JSON.stringify(job); JSONstringify(job)
..or..
job.stringify()
Excel Liberation for details
Portability
The Google Apps Script version of cJobject has the same
syntax (allowing for minor javaScript/VBA linguistic
differences)
Examples – Google Apps Script
var job = new cJobject();
job.add ("Flintstone Characters”);
var f = job.child("Flintstone Characters").add("families").addArray();
The cJobject is not really needed in GAS, since js can do
this natively. But using cJobject in GAS allows portability
to and from VBA. There are also native conversions for
GAS available
Examples – Google Apps Script
var job = fromNative(someObject);
var someObject = job.toNative();
Excel Liberation for details
Iteration
How to iterate through cJobject children.
Examples - vba
for each joc in job.children
Debug.Print job.key,job.value
next joc
Examples - gas
job.children().forEach( function (joc) {
Logger.log (job.key() + “,” + job.value());
});
Equivalent in native javaScript
Examples
var jsObject = job.toNative();
for (k in jsObject ) {
console.log(k + “,” + jsObject [k]);
}
Excel Liberation for details
Recursion
Since cJobjects are of inderminate depth, recursion is used internally in the
class and they are ideally suited for recursive usage. Here‟s an example of
traversing and printing an entire object tree irrespective of the data structure.
Examples
Public Function printFlint(Optional job As cJobject = Nothing, _
Optional depth As Long = 0)
Dim joc As cJobject
If (job Is Nothing) Then Set job = getFlintsoneCharacters()
Debug.Print Space(depth); job.key; ":"; job.value
depth = depth + 2
For Each joc In job.children
depth = printFlint(joc, depth)
Next joc
printFlint = depth - 2
End Function
Flintstone Characters:
families:
1:
family:
name:FlintStone
wife:Wilma
husband:Fred
kids:
1:Pebbles
pets:
saber tooth tiger:Baby Puss
dinosaur type dog thing:Dino
dodo bird:Doozy
2:
family:
name:Rubble
wife:Betty
husband:Barney
kids:
1:Bam Bam
pets:
kangaroo type thing:Hoppy
Excel Liberation for details
Extensibility
Easy to extend with powerful capabilities
Examples
Populate a data set with JSON data
dSet.populateJSON jobject, Range("json1!$a$1")
Read a worksheet into a dset and convert it to JSON
dSet.populateData( Range("jSon2!$a$1"), , , , , , True).jObject.stringify()
Get the fullkey of any item
job.fullKey() – eg Flintstones characters.1.family.name
Find a property somewhere
set wilma = job.find(“Wilma”)
Make a treeview from a cJobject contents to display on a form
set t= job. toTreeView(treeViewObject)
Access data returned from a rest API query
With restQuery(worksheetName, "my society", , "postcode", _
, , , False, False)
For Each job In .jObject.children ......
Excel Liberation for details
Chaining
The cJobect is designed to be chainable
Examples – VBA
With .add.add("module")
.add "name", module.name
.add "kind", module.textKind
With .add("procedures").addArray
For Each procedure In module.procedures
With .add.add("procedure")
.add "name", procedure.name
.add "scope", procedure.scope
.add "kind", procedure.procTextKind
.add "returns", procedure.procReturns
.add "lineCount", procedure.lineCount
.add "declaration", procedure.declaration
With .add("arguments").addArray
For Each argument In procedure.arguments
With .add.add("argument")
.add "name", argument.name
.add "optional", argument.isOptional
.add "default", argument.default
.add "argtype", argument.argType
End With
Next argument
End With
End With
Next procedure
End With
End With
Excel Liberation for details
Custom classes and sub classes
Creating classes in VBA requires preknowledge about the class and its properties. The cJobject can
be used to create classes „on the fly‟ to avoid cluttering the source code with many small classes
Examples
With job.init(Nothing, "Flintstone Characters").add("families").addArray
With .add.add("family")
.add "name", "FlintStone"
.add "wife", "Wilma"
.add "husband", "Fred"
With .add("kids").addArray
.add , "Pebbles"
End With
With .add("pets").addArray
.add "saber tooth tiger", "Baby Puss"
.add "dinosaur type dog thing", "Dino"
.add "dodo bird", "Doozy"
End With
End With
End with
Set clone = job.clone()
Excel Liberation for details
‘Javascript like’ optional arguments
It‟s very useful in javascript to be able to pass a single argument to a function containing options and
other data. The cJobject allows you do the something similar in VBA
Examples
.. Calling with a couple of non default options
reshapeMelt "{'outputSheet':'meltOut','id':['id','time']}“
-------------
Public Function rOptionDefaults() As String
„ the default options..
rOptionDefaults = _
"{'complain':true, 'inputSheet':'" & ActiveSheet.name & "'," & _
"'variableColumn' : 'variable', 'valueColumn' : 'value', 'id':['id'] ," & _
"'outputSheet': 'rOutputData' , 'clearContents':true}"
End Function
Public Function reshapeMelt(options As String) As cDataSet
„... Applies default options and meges with given options
Set jArgs = optionsExtend(options, rOptionDefaults)
' use the options...
With jArgs
If .toString("inputsheet") = .toString("outputsheet") Then
MsgBox ("Reading and writing to the same sheet - not allowed")
Exit Function
End If
End With
Excel Liberation for details
Memory recovery
Like many objects with recursive linking, memory will
not be recovered by the VBA garbage collector
simply by going out of scope. A teardown is
provided, and should be used for efficient memory
recovery.
Examples
With JSONparse(str)
for each joc in .children
Debug.Print joc.value
next joc
.teardown
End With
Excel Liberation for details
Summary
These examples show some of the capabilities of
cJObect and bringing a JSON capability to Excel
For more detail, and to download see Excel Liberation

Más contenido relacionado

La actualidad más candente

ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 

La actualidad más candente (20)

Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815
 
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
 
C++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用するC++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用する
 
How to write a TableGen backend
How to write a TableGen backendHow to write a TableGen backend
How to write a TableGen backend
 
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
 
ゆるやかにBigQuery(データ基盤)を安定活用するプラクティス集 #bq_sushi
ゆるやかにBigQuery(データ基盤)を安定活用するプラクティス集 #bq_sushi ゆるやかにBigQuery(データ基盤)を安定活用するプラクティス集 #bq_sushi
ゆるやかにBigQuery(データ基盤)を安定活用するプラクティス集 #bq_sushi
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
Modern Authentication -- FIDO2 Web Authentication (WebAuthn) を学ぶ --
Modern Authentication -- FIDO2 Web Authentication (WebAuthn) を学ぶ --Modern Authentication -- FIDO2 Web Authentication (WebAuthn) を学ぶ --
Modern Authentication -- FIDO2 Web Authentication (WebAuthn) を学ぶ --
 
인공지능 슈퍼마리오의 거의 모든 것( Pycon 2018 정원석)
인공지능 슈퍼마리오의 거의 모든 것( Pycon 2018 정원석)인공지능 슈퍼마리오의 거의 모든 것( Pycon 2018 정원석)
인공지능 슈퍼마리오의 거의 모든 것( Pycon 2018 정원석)
 
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
 
C程式-函式與巨集
C程式-函式與巨集C程式-函式與巨集
C程式-函式與巨集
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
Wasserstein GAN 수학 이해하기 I
Wasserstein GAN 수학 이해하기 IWasserstein GAN 수학 이해하기 I
Wasserstein GAN 수학 이해하기 I
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 

Similar a Javascript like objects and JSON processing in VBA

Write better python code with these 10 tricks | by yong cui, ph.d. | aug, 202...
Write better python code with these 10 tricks | by yong cui, ph.d. | aug, 202...Write better python code with these 10 tricks | by yong cui, ph.d. | aug, 202...
Write better python code with these 10 tricks | by yong cui, ph.d. | aug, 202...
amit kuraria
 
ES6 General Introduction
ES6 General IntroductionES6 General Introduction
ES6 General Introduction
Thomas Johnston
 

Similar a Javascript like objects and JSON processing in VBA (20)

QTP
QTPQTP
QTP
 
Js types
Js typesJs types
Js types
 
Polyglot Persistence
Polyglot PersistencePolyglot Persistence
Polyglot Persistence
 
Javascript the New Parts v2
Javascript the New Parts v2Javascript the New Parts v2
Javascript the New Parts v2
 
Art of Javascript
Art of JavascriptArt of Javascript
Art of Javascript
 
Kotlin Austin Droids April 14 2016
Kotlin Austin Droids April 14 2016Kotlin Austin Droids April 14 2016
Kotlin Austin Droids April 14 2016
 
The Ring programming language version 1.5.2 book - Part 6 of 181
The Ring programming language version 1.5.2 book - Part 6 of 181The Ring programming language version 1.5.2 book - Part 6 of 181
The Ring programming language version 1.5.2 book - Part 6 of 181
 
Wakanday JS201 Best Practices
Wakanday JS201 Best PracticesWakanday JS201 Best Practices
Wakanday JS201 Best Practices
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using Room
 
An Introduction to Scala (2014)
An Introduction to Scala (2014)An Introduction to Scala (2014)
An Introduction to Scala (2014)
 
Typescript - why it's awesome
Typescript - why it's awesomeTypescript - why it's awesome
Typescript - why it's awesome
 
Week3
Week3Week3
Week3
 
Immutability, and how to do it in JavaScripts
Immutability, and how to do it in JavaScriptsImmutability, and how to do it in JavaScripts
Immutability, and how to do it in JavaScripts
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 
JavaScript Workshop
JavaScript WorkshopJavaScript Workshop
JavaScript Workshop
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
Write better python code with these 10 tricks | by yong cui, ph.d. | aug, 202...
Write better python code with these 10 tricks | by yong cui, ph.d. | aug, 202...Write better python code with these 10 tricks | by yong cui, ph.d. | aug, 202...
Write better python code with these 10 tricks | by yong cui, ph.d. | aug, 202...
 
Processing XML and Spreadsheet data in Go
Processing XML and Spreadsheet data in GoProcessing XML and Spreadsheet data in Go
Processing XML and Spreadsheet data in Go
 
ES6 General Introduction
ES6 General IntroductionES6 General Introduction
ES6 General Introduction
 
Ch2
Ch2Ch2
Ch2
 

Más de Bruce McPherson

Google apps script database abstraction exposed version
Google apps script database abstraction   exposed versionGoogle apps script database abstraction   exposed version
Google apps script database abstraction exposed version
Bruce McPherson
 

Más de Bruce McPherson (16)

Do something in 5 with gas 8-copy between databases
Do something in 5 with gas 8-copy between databasesDo something in 5 with gas 8-copy between databases
Do something in 5 with gas 8-copy between databases
 
Do something in 5 with gas 9-copy between databases with oauth2
Do something in 5 with gas 9-copy between databases with oauth2Do something in 5 with gas 9-copy between databases with oauth2
Do something in 5 with gas 9-copy between databases with oauth2
 
Goa tutorial
Goa tutorialGoa tutorial
Goa tutorial
 
Do something in 5 with apps scripts number 6 - fusion crossfilter
Do something in 5 with apps scripts number 6 - fusion crossfilterDo something in 5 with apps scripts number 6 - fusion crossfilter
Do something in 5 with apps scripts number 6 - fusion crossfilter
 
Do something in 5 with gas 7-email log
Do something in 5 with gas 7-email logDo something in 5 with gas 7-email log
Do something in 5 with gas 7-email log
 
Do something useful in Apps Script 5. Get your analytics pageviews to a sprea...
Do something useful in Apps Script 5. Get your analytics pageviews to a sprea...Do something useful in Apps Script 5. Get your analytics pageviews to a sprea...
Do something useful in Apps Script 5. Get your analytics pageviews to a sprea...
 
Do something in 5 with gas 4- Get your analytics profiles to a spreadsheet
Do something in 5 with gas 4- Get your analytics profiles to a spreadsheetDo something in 5 with gas 4- Get your analytics profiles to a spreadsheet
Do something in 5 with gas 4- Get your analytics profiles to a spreadsheet
 
Do something in 5 with gas 3-simple invoicing app
Do something in 5 with gas 3-simple invoicing appDo something in 5 with gas 3-simple invoicing app
Do something in 5 with gas 3-simple invoicing app
 
Do something in 5 with gas 2-graduate to a database
Do something in 5 with gas 2-graduate to a databaseDo something in 5 with gas 2-graduate to a database
Do something in 5 with gas 2-graduate to a database
 
Do something in 5 minutes with gas 1-use spreadsheet as database
Do something in 5 minutes with gas 1-use spreadsheet as databaseDo something in 5 minutes with gas 1-use spreadsheet as database
Do something in 5 minutes with gas 1-use spreadsheet as database
 
Google apps script database abstraction exposed version
Google apps script database abstraction   exposed versionGoogle apps script database abstraction   exposed version
Google apps script database abstraction exposed version
 
Google cloud datastore driver for Google Apps Script DB abstraction
Google cloud datastore driver for Google Apps Script DB abstractionGoogle cloud datastore driver for Google Apps Script DB abstraction
Google cloud datastore driver for Google Apps Script DB abstraction
 
Dbabstraction
DbabstractionDbabstraction
Dbabstraction
 
Using script db as a deaddrop to pass data between GAS, JS and Excel
Using script db as a deaddrop to pass data between GAS, JS and ExcelUsing script db as a deaddrop to pass data between GAS, JS and Excel
Using script db as a deaddrop to pass data between GAS, JS and Excel
 
JavaScript client API for Google Apps Script API primer
JavaScript client API for Google Apps Script API primerJavaScript client API for Google Apps Script API primer
JavaScript client API for Google Apps Script API primer
 
VBA API for scriptDB primer
VBA API for scriptDB primerVBA API for scriptDB primer
VBA API for scriptDB primer
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

Javascript like objects and JSON processing in VBA

  • 1. Javascript like objects and JSON processing in VBA cJobject primer from Excel Liberation
  • 2. Excel Liberation for details cJobject purpose The Excel/VBA model is optimized for 2 dimensions (rows/columns) – or at best 3 (sheets/rows/columns) { "Flintstone Characters": { "families": [ { "family": { "name": "FlintStone", "wife": "Wilma", "husband": "Fred", "kids": [ "Pebbles" ], "pets": [ "Baby Puss", "Dino", "Doozy" ] } }, { "family": { "name": "Rubble", "wife": "Betty", "husband": "Barney", "kids": [ "Bam Bam" ], "pets": [ "Hoppy" ] } } ] } } Data from web sources can be any depth. VBA lacked the capability to deal with either the format or the structure of JSON data. cJobject provides both the structure and data handling capability
  • 3. Excel Liberation for details Javascript object versus cJobject VBA lacks the syntax to express such an object as concisely as javascript,but a similar capability can be achieved with cJobjectAction javaScript cJobject New object var job = {}; Set job = new cJobect Create from JSON var job = JSON.parse(str); Set job = JSONParse(str) Add a property job["Flintstone Characters”] = null; job.add ("Flintstone Characters”) Add an array var f = job["Flintstone Characters”] ={families:[]}; Set f = job.child("Flintstone Characters").add("families").addArr ay Add an array element object f.push({family:{name:”Flintstone”,wi fe:”Wilma”,husband:”Fred”}); With f.add.add("family") .add "name", "FlintStone" .add "wife", "Wilma" .add "husband", "Fred“ End with Convert to JSON JSON.stringify(job); JSONstringify(job) ..or.. job.stringify()
  • 4. Excel Liberation for details Portability The Google Apps Script version of cJobject has the same syntax (allowing for minor javaScript/VBA linguistic differences) Examples – Google Apps Script var job = new cJobject(); job.add ("Flintstone Characters”); var f = job.child("Flintstone Characters").add("families").addArray(); The cJobject is not really needed in GAS, since js can do this natively. But using cJobject in GAS allows portability to and from VBA. There are also native conversions for GAS available Examples – Google Apps Script var job = fromNative(someObject); var someObject = job.toNative();
  • 5. Excel Liberation for details Iteration How to iterate through cJobject children. Examples - vba for each joc in job.children Debug.Print job.key,job.value next joc Examples - gas job.children().forEach( function (joc) { Logger.log (job.key() + “,” + job.value()); }); Equivalent in native javaScript Examples var jsObject = job.toNative(); for (k in jsObject ) { console.log(k + “,” + jsObject [k]); }
  • 6. Excel Liberation for details Recursion Since cJobjects are of inderminate depth, recursion is used internally in the class and they are ideally suited for recursive usage. Here‟s an example of traversing and printing an entire object tree irrespective of the data structure. Examples Public Function printFlint(Optional job As cJobject = Nothing, _ Optional depth As Long = 0) Dim joc As cJobject If (job Is Nothing) Then Set job = getFlintsoneCharacters() Debug.Print Space(depth); job.key; ":"; job.value depth = depth + 2 For Each joc In job.children depth = printFlint(joc, depth) Next joc printFlint = depth - 2 End Function Flintstone Characters: families: 1: family: name:FlintStone wife:Wilma husband:Fred kids: 1:Pebbles pets: saber tooth tiger:Baby Puss dinosaur type dog thing:Dino dodo bird:Doozy 2: family: name:Rubble wife:Betty husband:Barney kids: 1:Bam Bam pets: kangaroo type thing:Hoppy
  • 7. Excel Liberation for details Extensibility Easy to extend with powerful capabilities Examples Populate a data set with JSON data dSet.populateJSON jobject, Range("json1!$a$1") Read a worksheet into a dset and convert it to JSON dSet.populateData( Range("jSon2!$a$1"), , , , , , True).jObject.stringify() Get the fullkey of any item job.fullKey() – eg Flintstones characters.1.family.name Find a property somewhere set wilma = job.find(“Wilma”) Make a treeview from a cJobject contents to display on a form set t= job. toTreeView(treeViewObject) Access data returned from a rest API query With restQuery(worksheetName, "my society", , "postcode", _ , , , False, False) For Each job In .jObject.children ......
  • 8. Excel Liberation for details Chaining The cJobect is designed to be chainable Examples – VBA With .add.add("module") .add "name", module.name .add "kind", module.textKind With .add("procedures").addArray For Each procedure In module.procedures With .add.add("procedure") .add "name", procedure.name .add "scope", procedure.scope .add "kind", procedure.procTextKind .add "returns", procedure.procReturns .add "lineCount", procedure.lineCount .add "declaration", procedure.declaration With .add("arguments").addArray For Each argument In procedure.arguments With .add.add("argument") .add "name", argument.name .add "optional", argument.isOptional .add "default", argument.default .add "argtype", argument.argType End With Next argument End With End With Next procedure End With End With
  • 9. Excel Liberation for details Custom classes and sub classes Creating classes in VBA requires preknowledge about the class and its properties. The cJobject can be used to create classes „on the fly‟ to avoid cluttering the source code with many small classes Examples With job.init(Nothing, "Flintstone Characters").add("families").addArray With .add.add("family") .add "name", "FlintStone" .add "wife", "Wilma" .add "husband", "Fred" With .add("kids").addArray .add , "Pebbles" End With With .add("pets").addArray .add "saber tooth tiger", "Baby Puss" .add "dinosaur type dog thing", "Dino" .add "dodo bird", "Doozy" End With End With End with Set clone = job.clone()
  • 10. Excel Liberation for details ‘Javascript like’ optional arguments It‟s very useful in javascript to be able to pass a single argument to a function containing options and other data. The cJobject allows you do the something similar in VBA Examples .. Calling with a couple of non default options reshapeMelt "{'outputSheet':'meltOut','id':['id','time']}“ ------------- Public Function rOptionDefaults() As String „ the default options.. rOptionDefaults = _ "{'complain':true, 'inputSheet':'" & ActiveSheet.name & "'," & _ "'variableColumn' : 'variable', 'valueColumn' : 'value', 'id':['id'] ," & _ "'outputSheet': 'rOutputData' , 'clearContents':true}" End Function Public Function reshapeMelt(options As String) As cDataSet „... Applies default options and meges with given options Set jArgs = optionsExtend(options, rOptionDefaults) ' use the options... With jArgs If .toString("inputsheet") = .toString("outputsheet") Then MsgBox ("Reading and writing to the same sheet - not allowed") Exit Function End If End With
  • 11. Excel Liberation for details Memory recovery Like many objects with recursive linking, memory will not be recovered by the VBA garbage collector simply by going out of scope. A teardown is provided, and should be used for efficient memory recovery. Examples With JSONparse(str) for each joc in .children Debug.Print joc.value next joc .teardown End With
  • 12. Excel Liberation for details Summary These examples show some of the capabilities of cJObect and bringing a JSON capability to Excel For more detail, and to download see Excel Liberation