Coder Social home page Coder Social logo

Comments (2)

hkellaway avatar hkellaway commented on August 23, 2024

i don't see that one could get around having to serialize the property of the superclass A - what B is doing with its override is saying, ignore As implementation and do this instead; it makes sense.

a more descriptive way of achieving the full JSON in class B might be something like:

override func toJSON() -> JSON? {
    guard
        let superJSON = super.toJSON(),
        var json = jsonify([ "bar" ~~> self.bar ]) else {
            return nil
    }

    json.add(superJSON) // `add` is a custom function that combines two dictionaries

    return json
}

the add function you see there combines two dictionaries (see the ExtensionDictionary.swift file in the Gloss library for an example of how one might implement that).

but the bigger issue i see is that this set up violates (my understanding of) the Liskov Substitution Principle - which says that a subclass should be substitutable for its superclass. in this setup, your application code would have to know it was using an instance of B in order to access the bar property, which means A and B are not substitutable. another way to phrase this is, whether we have a class of type A or of type B at runtime, we want calling toJSON on it to produce the same output. so, perhaps, a rethink of the models is due.

hope that helps!

from gloss.

doncorsean avatar doncorsean commented on August 23, 2024

So I've got a test working where super.toJSON() is merged with the result of jsonify. My problem is I have hundreds of generated classes which each require implementation of these initializer/toJSON methods. Seems like tons of boilerplate code for already known and defined properties within a class. Would be nice if Swift's "reflection" would allow us to skip this manual declaration of all the mapping if the structure of the JSON and property names were verbatim and we would only need to implement toJSON when one wanted to customize the serialization.

from gloss.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.