앱인벤터2 Dictionaries 블록 심화 탐구

전체 강좌 목록:
http://semicolon1.kr/appinventor.html

 

post_hard_dict_01.png

파워포인트로 10분만에 뚝딱 만들어본 썸네일

 

본 강좌에서는 이전 강좌에서 강좌 분리한다 했던 4 블록에 대해 자세히 알아볼 예정입니다.
먼저, 이 강좌를 보고 이해하려면 JSON에 대해 어느 정도 기초를 이해하고 있는 게 좋습니다.
여기서는 JSON 관련 이야기는 하지 않도록 하겠습니다.

먼저, 예제로 사용할 Dictionary를 하나 만들어 보겠습니다.

post_hard_dict_02.png

블록으로 보면 위와 같고, JSON 형식으로 보면 아래와 같습니다:

1
2
3
4
5
6
7
8
9
{
  “id”:  1,
  “name”:  “Tim the Beaver”,
  “school”: {
    “name”“Massachusetts Institute of Technology”
  },
  “enrolled”true,
  “classes”: [“6.001”“18.01”“8.01”]
}
cs

이제부터 위 dictionary와 JSON으로 설명을 하겠습니다.


post_hard_dict_03.png

이 블록은 두번째서 받아온 dictionary에서 첫번째 칸에서 리스트 형태로 받아온 키 경로를 따라가서 나오는 값을 반환합니다.
여기서 키 경로가 무엇이냐?
단순 Dictionary에서 키-값 꼴의 리스트만 사용할 경우, 키 경로는 단순히 키 값이 될 수 있습니다.
그때는 굳이 이 블록을 쓸 필요가 없이 get value for key블록을 사용하시면 됩니다.
그러나, JSON의 경우 위 예제에서 보듯이 값 안에 또 키-값이 들어있거나, 리스트가 들어 있는등 값이 층층이 갚어집니다.
그래서 속의 값에 접근하려면 각 키를 순서대로 접근해야 하고, 이 순서대로 접근할 키의 리스트를 key parh자리에 꼽으시면 되는 것 입니다.

바로 예시를 보죠.

post_hard_dict_04.png

testDict 변수는 처음에 말했던 예제가 담긴 변수 입니다.
key path에 “이름”만 있습니다. 왜냐하면 키 이름의 경우 어디 안쪽에 있는게 아니라 최상단에 있기 때문이죠.
그럼 키 school 아래의 키 nameMassachusetts Institute of Technology를 가져오려면 어떻게 해야할까요?

예제를 보면 알 수 있듯, 키 school안에 다시 키-값 형태로 name-Massachusetts Institute of Technology가 있습니다.
그럼 답은 나왔네요. key path는 다음과 같이 되면 됩니다:

post_hard_dict_05.png

참고로, 이상하게도 키가 한글인 경우 key parh가 정상이어도 not found가 나오니 참고바랍니다.
예제가 영어인 이유도 이때문입니다. 이게 버그인지는 모르겠지만 글쓰는 현재(2020/02/08)는 그렇습니다.

그 다음 예시를 볼까요?
위 예제서 키 classes 값은 리스트 입니다. 이 리스트에서 요소 18.01을 가져오려면 어떻게 해야할까요?

post_hard_dict_06.png

위처럼 숫자 블록으로 해당 리스트의 위치로 접근해 값을 가져올 수 있습니다.

post_hard_dict_07.png

이제 key path에대해 알게 되었으니, 위 블록도 쓰실 수 있겠죠?
key path를 지정후, 해당 위치에 세번째 칸에서 입력받은 값을 추가하는 것 입니다.

하나 예제를 보도록 하죠.
위 예제서 키 school 아래쪽에 키-값형태 name2-New School을 추가해보세요.
결과 JSON은 다음과 같이 되어야 합니다:

1
2
3
4
5
6
7
8
9
10
{
  “id”:  1,
  “name”:  “Tim the Beaver”,
  “school”: {
    “name”“Massachusetts Institute of Technology”,
    “name2”:“New School”
  },
  “enrolled”true,
  “classes”: [“6.001”“18.01”“8.01”]
}
cs

정답은 다음과 같습니다:

post_hard_dict_08.png


들어가기전 레벨(level)에 대해 잠깐 알아보도록 하겠습니다.
흠 좀 설명이 복잡할 수 있을것 같은데 해당 키와 동등한 위치(레벨)에 있는것이라 보면 됩니다.
예시로 위에서 썼던 예제를 다시 들고와 보겠습니다.

1
2
3
4
5
6
7
8
9
10
{
  “id”:  1,
  “name”:  “Tim the Beaver”,
  “school”: {
    “name”“Massachusetts Institute of Technology”,
    “name2”:“New School”
  },
  “enrolled”true,
  “classes”: [“6.001”“18.01”“8.01”]
}
cs

여기서 키 id와 동일한 레벨의 키들은 id, name, school, enrooled, classes가 되고,
school > name과 동일한 레벨의 키들은 name, name2가 되겠습니다.
JSON에 대해서 기초 지식이 없으면 이해가 힘들수 있겠습니다.


두번째 블록에서는 조금 다른 예제를 써보겠습니다.

post_hard_dict_09.png

1
2
3
4
5
6
7
8
9
10
11
12
{
  “people”: [{
    “first_name”“Tim”,
    “last_name”“Beaver”
  },{
    “first_name”“John”,
    “last_name”“Smith”,
  },{
    “first_name”“Jane”,
    “last_name”“Doe”
  }]
}
cs

구조는 위와 같습니다.

post_hard_dict_10.png

먼저, list by walking key path 블록 입니다. 이 블록은 해당 key path로 이동하여서 해당 레벨에 있는 값을 모두 읽어와서 리스트로 반환합니다.
예시로

post_hard_dict_11.png

이러하게 접근을 해서 값을 가져온다 합니다. 그러면 반환값은 키 people의 값의 모든 자료를 가져오므로, 반환값은

1
2
3
4
5
6
7
8
9
10
11
12
[
[{
    “first_name”“Tim”,
    “last_name”“Beaver”
  },{
    “first_name”“John”,
    “last_name”“Smith”,
  },{
    “first_name”“Jane”,
    “last_name”“Doe”
}]
]
cs

이렇게 되겠습니다.
값을 리스트로 반환한다 했기 때문에, 리스트로 묶여있는것을 볼 수 있습니다.

그렇다면 여기서 두번째 first_name, second_name 묶음을 가져올 수 있을까요? 즉

1
2
3
4
5
6
[
{
    “first_name”“John”,
    “last_name”“Smith”,
}
]
cs

식으로 말이죠.
접근 방법을 생각해봅시다.
키 people의 값은 리스트로, 우리가 가져오려는 값은 그 리스트의 2번째 위치에 있습니다. 그렇다면 이렇게 하면 되겠네요:

post_hard_dict_12.png

자 그렇지만 여전히 가져온 값은 dictionary처럼 키-값으로 짝지어져 있습니다.
여기서 우리는 값만 골라내서

1
[“John”,“Smith”]
cs

형태로만 들고 오고 싶습니다. 그럼 어떻게 해야할까요?
물론 키를 가지고 일일이 노가다로 가져올 수 있지만, 비효율적입니다.
만약 이 예제와 달리

1
2
3
4
5
6
7
8
9
10
11
12
[
{
    “first_name”“John”,
    “last_name”“Smith”,
    “key1”“kddkal”,
    “key2”“gfads”,
    “key3”“er232t”,
    “key4”“yjtggf”,
    “key5”“adfas”,
}
]
cs

이렇게 수많은 값들이 나열되있다면?
이럴때 쓰는 블록이 바로

post_hard_dict_13.png

walk all at level 블록 입니다.
이 블록의 역할은 key path까지 이동 후, 그 위치의 모든 값(value)를 가져와 리스트로 반환합니다.
즉, 이렇게 하면:

post_hard_dict_14.png

반환값은

1
[“John”,“Smith”]
cs

가 됩니다.
만약 아래사진처럼

post_hard_dict_15.png

이렇게 하면, 키 people의 값을 모두 가져올테니 반환값은

1
2
3
4
5
6
7
8
9
10
[{
    “first_name”“Tim”,
    “last_name”“Beaver”
  },{
    “first_name”“John”,
    “last_name”“Smith”,
  },{
    “first_name”“Jane”,
    “last_name”“Doe”
}]
cs

이 되게됩니다.

특히 이렇게 JSON을 다루는 블록의 경우 다루기가 쉽지 않습니다.
저도 어렵고요, 많이 연습하는게 답인것 같습니다.
감사합니다.

댓글

Copied title and URL