Indeed there are many ways fo doing this. These are the two methods I find I keep reusing.

1. Map is the Mission
I create a map file - typically in the format:
Lines0-X - map tile data
Lines X+1 to end - object data
Each character in the Map tile data represents a tile.
Each line in the Object Data defines he information needed to create an object. This could be its name, stats, weapons carried etc.

Related to this would be details about the weapons etc (usually in a seperate file for each item).

2. Map is not the mission
Basically very similar but the Map file only contains map information. This allows the same map to be used in different mission contexts.
Then a mission file is created that links the map, and any objects together.

I have previously included AI as a seperate file that can be linked into the objects as they are created - for example I could create a line like:
Blue Knight, 100, 100, [Sword, Bow, Heavy Armor], Clever Hunter
When the game reads this line it creates a Blue Knight Object - In the Blue Knight character file it lists his hit point,s image etc - at position 100,100 - carrying a Sword, Bow and Heavy Armor - using the AI file Clever Hunter.

I have not yet done Mission Objectives and Win/Lose conditions like this.

Another Thought - I feel that the standard old Ini file format is very underutilised. There is no reason why you could not achieve a database structure using an Ini File. (In fact this is what I used for Run-A-War)

Another Thought - same applies to String Lists. Create a string list in a file where you use the Values method to load/store data. I create a key structure as follows <TableName>.<RecordKey>.<FieldName>=<Value> So I could do
Character.1.Name=Blue Knight
Character.1.Pos=100,100
Character.1.Items=Sword,Bow,Heavy Armor
Character.1.AI=Clever Hunter