I have a length unit converter written in Java. How can I implement the ability to expand the list of supported units by setting conversion rules via a JSON file?
Сlass ConversionCalculator:
package convert;
import java.util.Scanner;
public class ConversionCalculator
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.println("Convert from:");
String fromUnit = in.nextLine();
System.out.println("Convert to: ");
String toUnit = in.nextLine();
UnitConverter from = new UnitConverter(fromUnit);
UnitConverter to = new UnitConverter(toUnit);
System.out.println("Value:");
double val = in.nextDouble();
double meters = from.toMeters(val);
double converted = to.fromMeters(meters);
System.out.println(val " " fromUnit " = " converted " " toUnit);
}
}
public class UnitConverter:
public class UnitConverter {
static double INCHES = 0.0254001;
static double FEET = 0.3048;
static double MILES = 1609.35;
static double MILLIMETERS = 0.001;
static double CENTIMETERS = 0.01;
static double METERS = 1;
static double KILOMETERS = 1000;
private double val, meters, converted;
String afromUnit;
public UnitConverter(String fromUnit) {
afromUnit = fromUnit;
}
public double toMeters(double val) {
if (afromUnit.equals("in")) {
meters = (val * INCHES);
} else if (afromUnit.equals("ft")) {
meters = (val * FEET);
} else if (afromUnit.equals("mi")) {
meters = (val * MILES);
} else if (afromUnit.equals("mm")) {
meters = (val * MILLIMETERS);
} else if (afromUnit.equals("cm")) {
meters = (val * CENTIMETERS);
} else if (afromUnit.equals("m")) {
meters = (val * METERS);
} else {
meters = (val * KILOMETERS);
}
return meters;
}
public double fromMeters(double meters) {
if (afromUnit.equals("in")) {
converted = Math.round(meters * 39.369923740457715);
} else if (afromUnit.equals("ft")) {
converted = Math.round(meters * 3.280839895013123);
} else if (afromUnit.equals("mi")) {
converted = Math.round(meters * 0.0006213688756330196);
} else if (afromUnit.equals("mm")) {
converted = Math.round(meters * 1000);
} else if (afromUnit.equals("cm")) {
converted = Math.round(meters * 100);
} else if (afromUnit.equals("m")) {
converted = Math.round(meters * 1);
;
} else {
converted = Math.round(meters * 0.001);
}
return converted;
}
}
If I understand correctly, then the values of the coefficients must be added to the JSON file. After that, convert the JSON file to JAVA. Right? First time working with JSON files
CodePudding user response:
Your JSON could look like this:
[{
"name": "inches",
"unit": "in",
"conversion": "0.0254001",
}, {
"name": "meter",
"unit": "m",
"conversion: "1",
}]
In JAVA you could do something like this to read it in:
JSONParser parser = new JSONParser();
Object obj = parser.parse(new FileReader(file));
JSONArray jsonArray = new JSONArray(obj.toString());
for (int i = 0; i < jsonArray.length(); i ) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
System.out.println(jsonObject.get("name"));
System.out.println(jsonObject.get("unit"));
System.out.println(jsonObject.get("conversion"));
}
CodePudding user response:
Solved the problem. Code part:
public static void main(String[] args) {
String userJson = "[{\"unit\": \"in\", \"value\": \"11\", \"conversionto\": \"cm\"},"
"{\"unit\": \"ft\", \"value\": \"22\" , \"conversionto\": \"cm\"}]";
Gson gson = new Gson();
Type staffListType = new TypeToken<ArrayList<Staff>>(){}.getType();
ArrayList<Staff> staffArray = gson.fromJson(userJson, staffListType);
for(Staff staff : staffArray) {
System.out.println(staff);
String fromUnit = staff.unit;
String toUnit = staff.conversionto;
UnitConverter from = new UnitConverter(fromUnit);
UnitConverter to = new UnitConverter(toUnit);
double val = staff.value;
double meters = from.toMeters(val);
double converted = to.fromMeters(meters);
System.out.println(val " " fromUnit " = " converted " " toUnit);
}
}