You have several approaches you can do but they depend on what binding you are using to retrieve these values.
Assuming the HTTP or MQTT binding or binding that lets you create your own channels, and assuming it’s always 24 values and always in chronological order I would implement this at the binding level. Create one Channel for each entry with the JSONPATH to select the “total” for a given array element ($[0].total, $[1].total, and so on, see JsonPath - Transformation Services | openHAB). Make sure to name the element based on the time it represents. Link each Channel to a Number Item, again named/labeled with the time that value represents. Add the Items to a Group.
In a Rule you can sort the members of the Group to find the minimum and then use the name or label of the Item to extract which time is at the lowest value. See Design Pattern: Encoding and Accessing Values in Rules for further details.
If it isn’t an option to implement this at the Thing with Channels but the rest of my assumptions hold true I’d implement the same approach except using the transform Profile. You’d only have the one Channel but link that to the same 24 Items and use the transform Profile to extract the element for the given Item. Still use the Item name/label to identify which time the value represents.
In general, it’s going to be easier if you can get that bid array into Items. Once you have that it becomes a straight forward OH problem.
If my other assumptions do not hold true, you’ll need to write a rule to parse the JSON and extract/manipulate the values. But if you choose JavaScript, you are in luck as the JS in JSON stands for JavaScript. Call JSON.parse(items.Tibber_API_Prices_for_tomorrow_as_a_JSON_array.state)
and you will have converted the JSON into a JS Object which can be processed using normal coding tools.