When loading, you can never re-create a MonoBehaviour or ScriptableObject instance directly from JSON. Save data needs to be all entirely plain C# data with no Unity objects in it.
Loading/Saving ScriptableObjects by a proxy identifier such as name:
This does require an engineering decision of how you will identify things. I suggest keeping it simple and having 100% unique names, never renaming them, as noted in the above post. Yes you can do more whacky things in the future, but get the above working first, then go nuts later.