This approach scales well for a larger project. No hand-written
boilerplate is needed, and typos when accessing JSON fields are caught at
compile-time. The downside with code generation is that it requires some
initial setup. Also, the generated source files might produce visual clutter
in your project navigator.

You might want to use generated code for JSON serialization when you have a
medium or a larger project. To see an example of code generation based JSON
encoding, see Serializing JSON using code generation libraries.

Is there a GSON/Jackson/Moshi equivalent in Flutter?

The simple answer is no.

Such a library would require using runtime reflection, which is disabled in
Flutter. Runtime reflection interferes with tree shaking, which Dart has
supported for quite a long time. With tree shaking, you can “shake off” unused
code from your release builds. This optimizes the app’s size significantly.