###### tags: `konva`, `canvas`, `javascript`
# 【自學筆記】konva入門 - JSON
`Konva`是個`HTML5 Canvas JavaScript`的框架,透過`2d context`的擴展實現各種圖形功能,正好可以實現最近工作需求,就來研究看看囉
---
[範例程式](https://codepen.io/niodoshaba-the-flexboxer/pen/PoRYMea)
### Konva的toJSON
Konva提供了`toJSON`的方法,可將整個`stage`成`json`格式的資料,要存入server或是storage都可以,方便後續使用,例如這樣
```htmlembedded=
<body>
<div id="container"></div>
</body>
```
```javascript=
// 先創建一個Stage
var stage = new Konva.Stage({
container: 'container2',
width: 500,
height: 500
});
// 然後創建一個layer
var layer = new Konva.Layer();
// 用迴圈創建一堆circle
for (var n = 0; n < 10; n++) {
var circle = new Konva.Circle({
x: Math.random() * stage.width(),
y: Math.random() * stage.height(),
radius: Math.random() * 50 + 25,
fill: 'red',
strokeWidth: 3,
stroke: 'black',
});
layer.add(circle);
}
// 創建一個圖形
var rect = new Konva.Rect({
x: 300,
y: 90,
width: 100,
height: 50,
fill: 'green',
strokeWidth: 3,
offset: {
x: 50,
y: 25,
},
draggable: true,
});
layer.add(rect);
stage.add(layer);
// 將整個stage存成json
json = stage.toJSON();
// 這樣就可以取得該stage所有圖形的資料了
console.log(json)
```
:::danger
`toJSON()`不能存儲過濾器、圖片、事件監聽,所以==適合用在較小型的程序==,對於較複雜的案例後面其他文章再詳述。
:::
### 透過json創建圖形
既然可以將圖形存成`json`格式,當然也可以透過`json`創建圖形
作法也很簡單,只要讀取資料,並指定創建的位置(`container id`)就行了
```htmlembedded=
<body>
<div id="container2"></div>
</body>
```
```javascript=
var json = '{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{"x":100,"y":100,"sides":6,"radius":70,"fill":"red","stroke":"black","strokeWidth":4},"className":"RegularPolygon"}]}]}';
var stage_from_json = Konva.Node.create(json, 'container2');
```
---
*參考資料: https://konvajs.org/docs/*
*新手工程師的筆記,純粹記錄學了些啥東西
如果有前輩高人讀了我的文,文中有任何錯誤再麻煩指教指教*