template<> void Jsonize(JsonIO& io, Date& var) { if(io.IsLoading()) { const Value& v = io.Get(); if(IsNull(v)) { var = Null; return; } if(IsString(v)) { String text = v; if(text.GetCount() > 6) { Date d; d.year = ScanInt(text.Left(4)); d.month = ScanInt(text.Mid(4, 2)); d.day = ScanInt(text.Mid(6)); if(d.IsValid()) { var = d; return; } } } throw JsonizeError("string expected for Date value"); } else if(IsNull(var)) io.Set(Null); else io.Set(Format("%04d%02d%02d", var.year, var.month, var.day)); }
template<> void Jsonize(JsonIO& io, Time& var) { if(io.IsLoading()) { const Value& v = io.Get(); if(IsNull(v)) { var = Null; return; } if(IsString(v)) { String text = v; if(text.GetCount() > 15) { Time tm; tm.year = ScanInt(text.Left(4)); tm.month = ScanInt(text.Mid(4, 2)); tm.day = ScanInt(text.Mid(6, 2)); tm.hour = ScanInt(text.Mid(9, 2)); tm.minute = ScanInt(text.Mid(12, 2)); tm.second = ScanInt(text.Mid(15)); if(tm.IsValid()) { var = tm; return; } } } throw JsonizeError("string expected for Time value"); } else if(IsNull(var)) io.Set(Null); else io.Set(Format("%04d%02d%02d`T%02d:%02d:%02d", var.year, var.month, var.day, var.hour, var.minute, var.second)); }
void ValueMap::Jsonize(JsonIO& jio) { if(jio.IsLoading()) { data->Release(); Create(); } data->Jsonize(jio); }
template<> void Jsonize(JsonIO& io, int16& var) { double v = var; Jsonize(io, v); if(io.IsLoading()) { if(v >= -32768 && v <= 32767 && (int)v == v) var = (int16)v; else throw JsonizeError("16-bit integer expected"); } }
template<> void Jsonize(JsonIO& io, bool& var) { if(io.IsLoading()) { const Value& v = io.Get(); if(IsNumber(v) && !IsNull(v)) var = (bool)v; else throw JsonizeError("boolean expected"); } else io.Set(var); }
template<> void Jsonize(JsonIO& io, WString& var) { if(io.IsLoading()) { const Value& v = io.Get(); if(IsString(v)) var = v; else throw JsonizeError("string expected"); } else io.Set(var); }
template<> void Jsonize(JsonIO& io, int& var) { double v = IntDbl(var); Jsonize(io, v); if(io.IsLoading()) if(IsNull(v)) var = Null; else if(v >= INT_MIN && v <= INT_MAX) var = (int)v; else throw JsonizeError("number is not integer"); }
template<> void Jsonize(JsonIO& io, int64& var) { if(io.IsLoading()) { const Value& v = io.Get(); if(IsNull(v)) { var = Null; return; } if(v.Is<int64>() || v.Is<int>()) { var = v; return; } if(IsNumber(v)) { double d = v; if(d >= INT64_MIN && d <= INT64_MAX) { var = (int64)d; return; } } else if(IsString(v)) { int64 h = ScanInt64((String)v); if(!IsNull(h)) { var = h; return; } } throw JsonizeError("invalid int64 value"); } else if(IsNull(var)) io.Set(Null); else if(var >= I64(-9007199254740992) && var <= I64(9007199254740991)) io.Set(var); else io.Set(AsString(var)); }
template<> void Jsonize(JsonIO& io, double& var) { if(io.IsLoading()) { const Value& v = io.Get(); if(IsNull(v)) { var = Null; return; } if(IsNumber(v)) { var = io.Get(); return; } if(IsString(v)) { double h = ScanDouble((String)v); if(!IsNull(h)) { var = h; return; } } throw JsonizeError("number expected"); } else io.Set(var); }