琥珀和本地存储,作为JSON?

z--*_*z-- 6 json smalltalk local-storage amber-smalltalk

我想在Web浏览器的localStorage中存储Amber(在线IDE)和OrderedCollection,然后检索它.

创建测试数据对象

| coll hcoll |

coll := OrderedCollection new.
coll add: 'abc'.
coll add: 'xon'.

hcoll := HashedCollection new.
hcoll at: 'en' put: 'English'.
hcoll at: 'fr' put: 'French'.
hcoll at: 'ge' put: 'German'.

coll add: hcoll.
Run Code Online (Sandbox Code Playgroud)

将测试数据对象存储在localStorage中

localStorage是浏览器中的键值存储.值必须是字符串.

localStorage setItem: 'coll' value: coll asJSONString.


"We set coll to nil to indicate that we 
are going to retrieve it back from the localStorage"

coll := nil.
Run Code Online (Sandbox Code Playgroud)

取回存储的值

以下的printIt

localStorage getItem: 'coll' 
Run Code Online (Sandbox Code Playgroud)

 '["abc","xon",{"en":"English","fr":"French","ge":"German"}]' 
Run Code Online (Sandbox Code Playgroud)

这是一个JSON字符串.

如何取回OrderedCollection coll

使用浏览器中内置的JSON解析器

JSON parse: (localStorage getItem: 'coll')
Run Code Online (Sandbox Code Playgroud)

printIt的结果是

an Array ('abc' 'xon' [object Object]) 
Run Code Online (Sandbox Code Playgroud)

(JSON parse: (localStorage getItem: 'coll')) class
Run Code Online (Sandbox Code Playgroud)

Array 
Run Code Online (Sandbox Code Playgroud)

数组的第三个元素

((JSON parse: (localStorage getItem: 'coll')) at: 3) class
Run Code Online (Sandbox Code Playgroud)

是一个

JSObjectProxy
Run Code Online (Sandbox Code Playgroud)

如何获取任意JSON对象的Smalltalk表示(包含JavaScript数组和对象,OrderedCollections和HashedCollections,Smalltalk中的字典)?

注意

http://www.json.org

JSON基于两种结构:

  • 名称/值对的集合.在各种语言中,这被实现为对象,字典,散列表或关联数组.
  • 有序的值列表.在许多语言中,这被实现为数组,列表或序列.

z--*_*z-- 4

打印出来的

  SmalltalkImage current readJSObject: 
            (JSON parse: (localStorage getItem: 'coll'))  
Run Code Online (Sandbox Code Playgroud)

回馈

    an Array ('abc' 'xon' a Dictionary ('en' -> 'English' , 'fr' -> 'French' , 'ge' -> 'German')) 
Run Code Online (Sandbox Code Playgroud)

评论

(JSON parse: (localStorage getItem: 'coll'))  
Run Code Online (Sandbox Code Playgroud)

给出一个 JSProxyObject,然后通过方法 #readJSObject: 将其转换为 Amber 对象。此方法只是将调用重定向到底层 JavaScript 方法。