DynamoDB JSON ve Marshalling
DynamoDB API'sinden ham veriyi ilk okuduğunda, koyduğun JSON'a benzemez.
{"status": "open", "priority": 3} gibi düz bir nesne
{"status": {"S": "open"}, "priority": {"N": "3"}} olarak geri gelir. Her değer,
türünü adlandıran tek anahtarlı bir nesneye sarılır. O sarma DynamoDB JSON'dur ve
ona ve ondan dönüştürmeye marshalling denir.
Bu gürültü değil — DynamoDB'nin tipleri hatta belirsizlik olmadan tutma yöntemidir. Ama düz JSON bekleyen herkesi tökezletir ve onu elle yazmak hataya açıktır.
DynamoDB JSON nedir?
DynamoDB JSON, DynamoDB'nin kullandığı türle etiketlenmiş hat formatıdır: her değer, türünü adlandıran tek anahtarlı bir nesneye sarılır — string için {"S": "open"}, sayı için {"N": "3"}. Düz JSON'u bu formata dönüştürmeye (ve geri dönüştürmeye) marshalling denir. Set'leri, binary veriyi ve "3" string'ini 3 sayısından ayırt edemez hale gelen düz JSON'un aksine, türler hiçbir zaman belirsiz kalmaz.
- DynamoDB JSON her değeri türüyle etiketler — bir string için
{"S": "..."}, bir sayı için{"N": "..."}vb. - Marshalling = düz JSON → DynamoDB JSON. Unmarshalling = tersi.
- Sayılar hatta string'tir —
{"N": "3"},{"N": 3}değil — hassasiyeti korumak için. - Tür etiketleri, zaten modellediğin veri tipi sistemidir: S, N, B, BOOL, NULL, L, M, SS, NS, BS.
- Onu elle yazma. SDK'nın document client'ı (ya da bir dönüştürücü) senin için marshal eder; bunu yalnızca hata ayıklarken ya da ifade oluştururken manuel yap.
Sorun: düz JSON yeterli değil
JSON'un tam olarak üç skaler türü vardır — string, sayı, boolean — artı null, diziler ve
nesneler. DynamoDB'nin daha fazlası vardır: binary ve JSON'un hiç ifade edemediği üç
set türü (string set, number set, binary set). JSON ayrıca bir "3" string'ini bir
3 sayısından ya da bir listeyi bir set'ten ayırt edemez.
Yani DynamoDB JSON'unu olduğu gibi saklayamaz — her değerin tam türünün açıkça belirtilmesine ihtiyaç duyar. Tür tanımlayıcısı, bunu her istek ve yanıtta, kayıpsız olarak yapma yöntemidir.
Kodlama nasıl çalışır
Her attribute değeri, anahtarı bir tür tanımlayıcısı olan tek anahtarlı bir nesne olur:
| Tanımlayıcı | Tür | Örnek |
|---|---|---|
S | String | {"S": "open"} |
N | Number (string olarak) | {"N": "3"} |
B | Binary | {"B": "dGV4dA=="} |
BOOL | Boolean | {"BOOL": true} |
NULL | Null | {"NULL": true} |
L | List | {"L": [{"S": "a"}, {"N": "1"}]} |
M | Map | {"M": {"k": {"S": "v"}}} |
SS / NS / BS | String / Number / Binary set | {"SS": ["a", "b"]} |
Listeler ve map'ler aynı tanımlayıcıları en alta kadar iç içe geçirir, böylece derinden yapılandırılmış bir öğe derinden sarılı hale gelir. Sayılar bilerek string olarak hatta gider — bu, DynamoDB'nin bir JSON sayısının (IEEE-754 double) sessizce yuvarlayacağı keyfi hassasiyeti korumasını sağlar. Bunlar, modellediğin aynı veri tipleridir; DynamoDB JSON yalnızca onların AWS düşük seviyeli API referansında tanımlanan açık hatta-formudur.
Çalışılmış örnek: bir denetim günlüğü girişi
Uygulamanda yazacağın düz JSON:
{
"actor": "u-204",
"action": "ticket.close",
"ticketId": 8842,
"tags": ["billing", "urgent"],
"redacted": false
}API için DynamoDB JSON'a marshal edilmiş:
{
"actor": {"S": "u-204"},
"action": {"S": "ticket.close"},
"ticketId": {"N": "8842"},
"tags": {"SS": ["billing", "urgent"]},
"redacted": {"BOOL": false}
}Marshaller'ın yaptığı seçimlere dikkat et: ticketId, string değerli N oldu;
tags, bir liste değil bir string set (SS) oldu — kasıtlı bir karar, çünkü bir
set tekrarları çıkarır ve sırasızdır. tags'in SS mi yoksa L mi olması gerektiği,
dönüştürücünün senin için yapamayacağı bir modelleme kararıdır — kodlamayı anlamanın
neden önemli olduğunun tam sebebi budur.
DynoTable'da dönüştürme
Bunu elle okuman ya da yazman nadiren gerekir. Marshal etmek (ve geri) için DynamoDB JSON dönüştürücüsü'ne düz JSON yapıştır ve bir istek oluştururken, DynamoDB expression builder, ifadenin yanında doğru marshal edilmiş attribute-değer haritasını yayar. Uygulamanın kendisinde DynoTable, öğeleri düz, okunabilir değerler olarak gösterir ve yazmada onları senin için marshal eder.

Tuzaklar ve sonraki adımlar
- Sayılar DynamoDB JSON'da string'tir —
{"N": "3"}. Tırnaklama önemlidir; çıplak bir sayı yayma. - Set'ler ve listeler bir modelleme kararıdır ve kodlama onu görünür kılar — kasıtlı seç (bkz. veri tipleri).
- Uygulama kodunda elle marshalling yerine SDK document client'ı tercih et; manuel DynamoDB JSON'u hata ayıklama ve ifadeler için sakla.
- Boş string'lere öğelerde izin verilir ama tarihsel olarak araçları tökezletmiştir — uç durumları doğrula.
Tür etiketlerini gözle çözmek yerine öğelere düz değerler olarak göz atmak mı istiyorsun? DynoTable'ı indir ve verinle doğrudan çalış.


