Everything in a CSV is text, so types have to be guessed
A CSV file has no type information whatsoever. Every cell is a sequence of characters, and the difference between the number 42 and the string `"42"` simply is not recorded. JSON, by contrast, requires you to commit to a type for every value. So the conversion has to infer, and inference means guessing.
The usual rules are sensible and mostly right: something that looks like a number becomes a number, `true` and `false` become booleans, an empty cell becomes null or an empty string, and everything else stays a string. For most data this produces what you want without any intervention.
The failures are specific and worth knowing in advance. Identifiers made of digits - postcodes, phone numbers, account numbers, ISBNs - become numbers, which strips leading zeros and, above 15 digits, loses precision entirely. Version strings like `1.10` become the number 1.1. And a column that is numeric in most rows and textual in a few produces mixed types in the JSON, which then breaks strict consumers. When identifiers matter, turning type inference off and keeping everything as strings is the safer default.