@Jan Willem ter Weeme
Here’s an example that reads this input.json with the provided mapping.xml file. See MainExecution in the project.
May I ask what specifically wasn’t clear to you? Was it the identifier b, or how to actually read / write data after creating the mappings ?
Hi,
Thanks for the quick response. I fact I had different issues:
- Basic reading did not work. I learned from the example that it had to do with my 'test’ - I did the test in a new library, leading to some problems with the reference names.
- I am not familiar with XML nor JSON. I do not have a clear overview on how to construct the mapping. I added your simple example in my question, but the next question is how I make a mapping for a more realistic input, as given in the attachment. Some are 2-D arrays, and the indexes are never mentioned.
I think you’re looking for something like this:
<AimmsJSONMapping>
<ObjectMapping>
<ObjectMapping name="DeviceData">
<ValueMapping name="minimumMired" maps-to="minimumMired"/>
<ValueMapping name="maximumMired" maps-to="maximumMired"/>
<ValueMapping name="numberOfPWMChannels" maps-to="numberOfPWMChannels"/>
</ObjectMapping>
<ArrayMapping name="FluxConnectivityTable" iterative-reset="1">
<ArrayMapping iterative-binds-to="fc1" iterative-reset="1">
<ValueMapping iterative-binds-to="fc2" maps-to="FluxConnectivity(fc1,fc2)" force-dense="FluxConnectivityDomain(fc1,fc2)"/>
</ArrayMapping>
</ArrayMapping>
<ArrayMapping name="LedParams" iterative-reset="1">
<ObjectMapping iterative-binds-to="lp1">
<ValueMapping name="Vf" maps-to="LP_Vf(lp1)" force-dense="LP_VfDomain(lp1)"/>
<ArrayMapping name="R" iterative-reset="1">
<ValueMapping iterative-binds-to="lp2" maps-to="LP_R(lp1,lp2)" force-dense="LP_RDomain(lp1,lp2)"/>
</ArrayMapping>
</ObjectMapping>
</ArrayMapping>
</ObjectMapping>
</AimmsJSONMapping>
This works together with the following declarations in your model:
DeclarationSection DeviceData {
Parameter minimumMired;
Parameter maximumMired;
Parameter numberOfPWMChannels;
Set FluxConnectivitySet1 {
Index: fc1;
}
Set FluxConnectivitySet2 {
Index: fc2;
}
Parameter FluxConnectivity {
IndexDomain: (fc1,fc2);
}
Parameter FluxConnectivityDomain {
IndexDomain: (fc1,fc2);
Definition: 1;
}
Set LedParamSet1 {
Index: lp1;
}
Set LedParamSet2 {
Index: lp2;
}
Parameter LP_Vf {
IndexDomain: lp1;
}
Parameter LP_VfDomain {
IndexDomain: lp1;
Definition: 1;
}
Parameter LP_R {
IndexDomain: (lp1,lp2);
}
Parameter LP_RDomain {
IndexDomain: (lp1,lp2);
Definition: 1;
}
}
I tested this to work properly with your given input json file, and writing back the data will generate the same json file.
The entries for the “force-dense” attribute are there to make sure that output is also generated when the corresponding identifiers hold default values. They are of no consequence when reading the data.
Hi,
Thanks a lot for this complete answer. It works and it gives me examples for some structures to build that were not explicitly mentioned in the examples.
Looking back at the example, I think my struggle was on the "iterative-reset” and "iterative-binds-to”