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

양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
devCAT Studio, NEXON
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
devCAT Studio, NEXON
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
devCAT Studio, NEXON
 

La actualidad más candente (20)

【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
 
【de:code 2020】 2020 年も最高のゲームをつくろう! Game Stack でゲーム開発をしよう! ~ マルチプレイサーバー編 ~
【de:code 2020】 2020 年も最高のゲームをつくろう! Game Stack でゲーム開発をしよう! ~ マルチプレイサーバー編 ~【de:code 2020】 2020 年も最高のゲームをつくろう! Game Stack でゲーム開発をしよう! ~ マルチプレイサーバー編 ~
【de:code 2020】 2020 年も最高のゲームをつくろう! Game Stack でゲーム開発をしよう! ~ マルチプレイサーバー編 ~
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
Doozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_ltDoozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_lt
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
 
テストを書こう、Unity編
テストを書こう、Unity編テストを書こう、Unity編
テストを書こう、Unity編
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略
 
Dapr on Kubernetes
Dapr on KubernetesDapr on Kubernetes
Dapr on Kubernetes
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱いRails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
 
【Unite Tokyo 2019】【あら簡単】インテルのGPAを使ってあなたのUnityタイトルを高速化
【Unite Tokyo 2019】【あら簡単】インテルのGPAを使ってあなたのUnityタイトルを高速化【Unite Tokyo 2019】【あら簡単】インテルのGPAを使ってあなたのUnityタイトルを高速化
【Unite Tokyo 2019】【あら簡単】インテルのGPAを使ってあなたのUnityタイトルを高速化
 
MicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみるMicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみる
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 

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

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
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...
 
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
 
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...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
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
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
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
 

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