Where are the interfaces for received MQTT messages?

Is there any interface(in java)/schema/description available for received MQTT messages? Basicly what I’m receiving there is plain JSON structure for my uplink messages and I’m not sure how to parse and interpretate them. Can these JSON structures change?

The official description is at:
https://www.thethingsindustries.com/docs/reference/data-formats/#uplink-messages

I don’t think there is really a schema, to indicate for example which fields are mandatory and which ones are optional.

I have some Java code that uses Jackson to decode JSON at LoraLuftdatenForwarder/Ttnv3UplinkMessage.java at master · bertrik/LoraLuftdatenForwarder · GitHub
but I’m only parsing a few fields that a relevant to me.
Some properties are parsed using a Java data transfer object with field annotated with @JsonProperty and some other properties are parsed with the JsonNode.at() method. I use @JsonIgnoreProperties(ignoreUnknown = true) to ignore the JSON fields that have no equivalent in my Java code.

Parsing JSON is parsing JSON - nothing special in that regard. @bertrik has furnished you with everything you need to interpret the fields - if you are not sure what a field may indicate, like f_port or spreading_factor then you can learn more about LoRaWAN by reading the docs &/or Googling the term.

You can’t change the data structure for MQTT or WebHooks

With API calls you can provide a list of fields that you’d like.