[ create a new paste ] login | about

Link: http://codepad.org/LEYQ2k2s    [ raw code | fork ]

salihdb - D, pasted on May 29:
/*
    jsonyaz.d (28.05.2012 - Ali Çehreli)
*/
import std.stdio, std.json;
import std.traits; // isSomString, isArray vb. ifadeler için

JSONValue to(Hedef : JSONValue, T)(T değer) {
    JSONValue json;
 
    static if (isSomeString!T) {
        json.type = JSON_TYPE.STRING;
        json.str = std.conv.to!string(değer);
 
    } else static if (__traits(compiles, *değer)) {
        if (!değer) {
            json.type = JSON_TYPE.NULL;
         } else {
            assert(false, "Göstergeleri nasıl ifade edeceğimizi bilmiyoruz.");
        }
 
    } else static if (is (T : bool)) {
        json.type = değer ? JSON_TYPE.TRUE : JSON_TYPE.FALSE;
 
    } else static if (is (T : long)) {
        static if (is (T == ulong)) {
            enforce(değer <= long.max, format("Veri kaybı: Bir %s değeri olan
                                      %s, long'a sığamaz!", T.stringof, değer));
        }
        json.type = JSON_TYPE.INTEGER;
        json.integer = değer;

    } else static if (is (T : real)) {
        json.type = JSON_TYPE.FLOAT;
        json.floating = değer;
 
    } else static if (isArray!T) {
        json.type = JSON_TYPE.ARRAY;
 
        foreach (eleman; değer) {
            json.array ~= to!JSONValue(eleman);
        }

    } else static if (isAssociativeArray!T) {
        json.type = JSON_TYPE.OBJECT;
 
        JSONValue[string] elemanlar;
 
        foreach (anahtar, eleman; değer) {
            elemanlar[std.conv.to!string(anahtar)] = to!JSONValue(eleman);
        }
        json.object = elemanlar;

    } else static if (__traits(compiles, cast(JSONValue)değer)) {
        json = cast(JSONValue)(değer);

    } else {
        static assert(false, "Bu tür JSONValue'ya dönüştürülemez: "~T.stringof);
    }

    return json;
}
 
string opCastJSONValue(T)() {
    enum işlevBaşı = `
        JSONValue opCast(T : JSONValue)() const @property
        {
            JSONValue json;
            JSONValue[string] yapınınÜyesi;
        `;
    enum işlevSonu = `
            json.type = JSON_TYPE.OBJECT;
            json.object = yapınınÜyesi;
            return json;
        }`;
    enum size_t xFazlalık = 3; /* Parantezler ve nokta */
    enum size_t soldanKes = T.stringof.length + xFazlalık;

    string katmaİfadesi = işlevBaşı;
 
    foreach (i, üyeTürü; typeof(T.tupleof)) {
        enum değişken = T.tupleof[i].stringof[soldanKes..$];
        enum solTaraf = `yapınınÜyesi["` ~ değişken ~ `"]`;
        enum sağTaraf = `to!JSONValue(` ~ değişken ~ `);`;
        katmaİfadesi ~= solTaraf ~ "=" ~ sağTaraf;
    }
    return katmaİfadesi ~ işlevSonu;
}

struct Öğrenci
{
    string isim;
    ulong numara;
    uint[string] notlar;
    // Katma (mixin) ifadeleri, derleme anında buraya gelecek...
    mixin(opCastJSONValue!Öğrenci);
}

struct Öğretmen
{
    string ismi;
    string dersi;
    // Katma (mixin) ifadeleri, derleme anında buraya gelecek...
    mixin(opCastJSONValue!Öğretmen);
}
void main()
{
    JSONValue belge;   
    auto öğrenciler = [ Öğrenci("Ayşe", 12,
                               ["matematik" : 90,
                                "ingilizce" : 100 ]),
                        Öğrenci("Başak", 34,
                               ["matematik" : 95,
                                "ingilizce" : 99 ])
                      ];
    auto öğretmenler = [ Öğretmen("Mustafa Kemal", "Türkçe"),
                         Öğretmen("Ali Çehreli", "D Dili")
                       ];
    with(belge){
        type = JSON_TYPE.OBJECT;
        object["öğrenciler"] = to!JSONValue(öğrenciler);
        object["öğretmenler"] = to!JSONValue(öğretmenler);
    }
    writeln(toJSON(&belge));
}/* ÇIKTISI:
{
    "öğrenciler":[
    {
        "isim":"Ayşe",
        "numara":12,
        "notlar":
        {
            "ingilizce":100,
            "matematik":90
        }
    }, {
        "isim":"Başak",
        "numara":34,
        "notlar":
        {
            "ingilizce":99,
            "matematik":95
        }
    }
    ],
    "öğretmenler":[
    {
            "ismi":"Mustafa Kemal",
            "dersi":"Türkçe"
    }, {
            "ismi":"Ali Çehreli",
            "dersi":"D Dili"
    }
    ]
}
*/


Create a new paste based on this one


Comments: