Am 22.08.2014 16:53, schrieb Ary Borenszweig:
On 8/22/14, 3:33 AM, Sönke Ludwig wrote:
Without a serialization framework it would in theory work like this:

     JSONValue v = parseJSON(`{"age": 10, "name": "John"}`);
     auto p = new Person(v["name"].get!string, v["age"].get!int);

unfortunately the operator overloading doesn't work like this currently,
so this is needed:

     JSONValue v = parseJSON(`{"age": 10, "name": "John"}`);
     auto p = new Person(
         v.get!(Json[string])["name"].get!string,
         v.get!(Json[string])["age"].get!int);

But does this parse the whole json into JSONValue? I want to create a
Person without creating an intermediate JSONValue for the whole json.
Can this be done?

That would be done by the serialization framework. Instead of using parseJSON(), it could use parseJSONStream() to populate the Person instance on the fly, without putting the whole JSON into memory. But I'd like to leave that for a later addition, because we'd otherwise end up with duplicate functionality once std.serialization gets finalized.

Manually it would work similar to this:

auto nodes = parseJSONStream(`{"age": 10, "name": "John"}`);
with (JSONParserNode.Kind) {
        enforce(nodes.front == objectStart);
        nodes.popFront();
        while (nodes.front != objectEnd) {
                auto key = nodes.front.key;
                nodes.popFront();
                if (key == "name")
                        person.name = nodes.front.literal.string;
                else if (key == "age")
                        person.age = nodes.front.literal.number;
        }
}

Reply via email to