Of course! This is a very common requirement. Using Highcharts with Java typically means you are generating the chart configuration on the server-side (in Java) and then sending that configuration to a client-side (HTML/JavaScript) Highcharts instance to be rendered.

Here’s a comprehensive guide covering the main approaches, from the simplest to the most robust.
Core Concept: The Highcharts JSON Configuration
The key to understanding how Java and Highcharts work together is to realize that Highcharts is a JavaScript library. It doesn't understand Java directly. Instead, you create a JSON object in JavaScript that describes the chart's title, axes, series (data), colors, etc.
Your Java code's job is to generate this JSON string.
Here's a simple example of the JSON Highcharts expects:

{
"chart": {
"type": "line"
},: {
"text": "Monthly Average Temperature"
},
"xAxis": {
"categories": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
},
"yAxis": {: {
"text": "Temperature (°C)"
}
},
"series": [{
"name": "Tokyo",
"data": [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
}]
}
So, the question becomes: "How do I generate this JSON string in Java?"
Approach 1: Manual String Building (The Quick & Simple Way)
This is the most straightforward method. You simply build the JSON string using Java's string concatenation.
When to use it:
- For very simple, static charts.
- For quick prototypes.
- When you don't want to add any external libraries to your project.
Pros:

- No dependencies.
- Easy to understand for simple cases.
Cons:
- Very error-prone. A missing comma or quote will break your chart.
- Becomes unreadable and unmaintainable quickly.
- No validation.
Example:
public class SimpleChartBuilder {
public static String buildChartJson() {
// Be very careful with quotes and commas!
String json = "{"
+ "\"chart\": {\"type\": \"line\"},"
+ "\"title\": {\"text\": \"My Simple Chart\"},"
+ "\"xAxis\": {\"categories\": [\"A\", \"B\", \"C\"]},"
+ "\"series\": [{"
+ " \"name\": \"Series 1\","
+ " \"data\": [1, 2, 3]"
+ "}]"
+ "}";
return json;
}
public static void main(String[] args) {
String chartConfig = buildChartJson();
System.out.println(chartConfig);
// In a real web app, you would do this:
// request.setAttribute("chartConfig", chartConfig);
// And in your JSP: <script>var chart = new Highcharts.Chart(${chartConfig});</script>
}
}
Approach 2: Using a JSON Library (Recommended)
This is the standard and most common approach. You use a dedicated Java library to create a JSON object in a structured way, which then converts to a string. This is far more robust and readable.
Popular Libraries:
- Google Gson: A lightweight library from Google.
- Jackson: A very powerful and widely used library, especially in the Spring ecosystem.
- org.json: A simple, no-dependency library.
Example with Google Gson
Add the dependency to your pom.xml (Maven):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- Use the latest version -->
</dependency>
Write the Java code:
You create a POJO (Plain Old Java Object) that mirrors the JSON structure. This makes your code type-safe and easy to read.
import com.google.gson.Gson;
import com.google.gson.JsonObject;
// You can use POJOs or a JsonObject directly. JsonObject is more flexible.
public class GsonChartBuilder {
public static void main(String[] args) {
Gson gson = new Gson();
// Build the JSON structure using JsonObject
JsonObject chartJson = new JsonObject();
// Chart type
JsonObject chart = new JsonObject();
chart.addProperty("type", "line");
chartJson.add("chart", chart);
// Title
JsonObject title = new JsonObject();
title.addProperty("text", "Monthly Sales");
chartJson.add("title", title);
// Categories for X-Axis
JsonObject xAxis = new JsonObject();
xAxis.addProperty("categories", "['Jan', 'Feb', 'Mar', 'Apr', 'May']");
chartJson.add("xAxis", xAxis);
// Y-Axis
JsonObject yAxis = new JsonObject();
JsonObject yAxisTitle = new JsonObject();
yAxisTitle.addProperty("text", "Sales (in thousands)");
yAxis.add("title", yAxisTitle);
chartJson.add("yAxis", yAxis);
// Series (Data)
JsonObject series1 = new JsonObject();
series1.addProperty("name", "Product A");
series1.addProperty("data", "[5, 7, 3, 9, 12]");
JsonObject series2 = new JsonObject();
series2.addProperty("name", "Product B");
series2.addProperty("data", "[2, 6, 4, 8, 10]");
// Add series to a list and then to the main JSON
chartJson.add("series", gson.toJsonTree(new JsonObject[]{series1, series2}));
// Convert the JsonObject to a pretty-printed JSON string
String jsonString = gson.toJson(chartJson);
System.out.println(jsonString);
// In a real application (e.g., a Spring Boot REST controller):
// @GetMapping("/chart-data")
// public String getChartData() {
// return jsonString;
// }
}
}
Approach 3: Using a Dedicated Java Wrapper (The Most Robust Solution)
For projects that generate many charts, manually creating JSON can become tedious. A wrapper library provides a Java API specifically for building Highcharts configurations. You work with Java objects and methods, and the library handles the JSON generation for you.
The most popular library for this is:
Add the dependency:
<dependency>
<groupId>com.highcharts</groupId>
<artifactId>highcharts-java</artifactId>
<version>3.2.0</version> <!-- Check for the latest version -->
</dependency>
Write the Java code:
This feels much more natural for a Java developer. You use setters and fluent APIs.
import com.highcharts.Chart;
import com.highcharts.Options;
import com.highcharts.Series;
import com.highcharts.axis.XAxis;
import com.highcharts.axis.YAxis;
import com.highcharts.title.Title;
import com.highcharts.options.ChartType;
import com.highcharts.options.DataLabels;
import com.highcharts.options.PlotOptions;
public class HighchartsJavaWrapperExample {
public static void main(String[] args) {
// 1. Create a Chart object
Chart chart = new Chart();
// 2. Set the chart type
chart.setType(ChartType.LINE);
// 3. Set the title
Title title = new Title();
title.setText("Monthly Sales Report");
chart.setTitle(title);
// 4. Configure the X-Axis
XAxis xAxis = new XAxis();
xAxis.setCategories(new String[]{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul"});
chart.addXAxis(xAxis);
// 5. Configure the Y-Axis
YAxis yAxis = new YAxis();
yAxis.setTitle(new Title("Sales (in thousands)"));
chart.addYAxis(yAxis);
// 6. Create and add data series
Series series1 = new Series();
series1.setName("Product A");
series1.setData(new Number[]{5, 7, 3, 9, 12, 15, 8});
Series series2 = new Series();
series2.setName("Product B");
series2.setData(new Number[]{2, 6, 4, 8, 10, 13, 11});
chart.addSeries(series1);
chart.addSeries(series2);
// 7. Get the final JSON configuration
Options options = chart.toJsonOptions(); // Or chart.toJson()
String jsonString = options.toString();
System.out.println(jsonString);
// You can also get a JavaScript snippet that creates the chart
// String jsSnippet = chart.toJavaScript();
// System.out.println(jsSnippet);
}
}
Pros:
- Type-safe and IDE-friendly. Autocomplete works!
- Very readable and maintainable. The code clearly describes the chart.
- Reduces boilerplate and JSON syntax errors.
- Often provides additional helpers for common chart features.
Cons:
- Adds another dependency to your project.
Putting It All Together: A Full Web App Example (Spring Boot + Jackson)
This is a realistic example of how you'd serve chart data from a Java backend to a frontend.
Backend: Spring Boot Controller
This controller will prepare the data and put the JSON string into the model for the view.
// ChartController.java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import com.fasterxml.jackson.databind.ObjectMapper; // Jackson is included by default in Spring Boot
@Controller
public class ChartController {
@GetMapping("/sales-chart")
public String showChart(Model model) {
try {
// 1. Prepare your data (e.g., from a database)
String[] categories = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul"};
Number[] productAData = {5, 7, 3, 9, 12, 15, 8};
Number[] productBData = {2, 6, 4, 8, 10, 13, 11};
// 2. Use Jackson to build the JSON object
ObjectMapper mapper = new ObjectMapper();
// You can use a Map or a dedicated POJO. Map is quick here.
java.util.Map<String, Object> chartConfig = new java.util.HashMap<>();
chartConfig.put("chart", Map.of("type", "line"));
chartConfig.put("title", Map.of("text", "Monthly Sales Report"));
chartConfig.put("xAxis", Map.of("categories", categories));
java.util.Map<String, Object> yAxis = new java.util.HashMap<>();
yAxis.put("title", Map.of("text", "Sales (in thousands)"));
chartConfig.put("yAxis", yAxis);
java.util.Map<String, Object> series1 = new java.util.HashMap<>();
series1.put("name", "Product A");
series1.put("data", productAData);
java.util.Map<String, Object> series2 = new java.util.HashMap<>();
series2.put("name", "Product B");
series2.put("data", productBData);
chartConfig.put("series", List.of(series1, series2));
// 3. Convert the map to a JSON string
String jsonString = mapper.writeValueAsString(chartConfig);
// 4. Add the JSON to the model for the view
model.addAttribute("chartConfig", jsonString);
} catch (Exception e) {
e.printStackTrace();
}
// 5. Return the name of the HTML template
return "chartView";
}
}
Frontend: Thymeleaf HTML Template (src/main/resources/templates/chartView.html)
This HTML page will receive the JSON string and use it to initialize the Highcharts chart.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">Highcharts Chart</title>
<!-- 1. Include Highcharts from a CDN -->
<script src="https://code.highcharts.com/highcharts.js"></script>
</head>
<body>
<h1>Monthly Sales Report</h1>
<div id="chartContainer" style="width: 100%; height: 400px;"></div>
<script th:inline="javascript">
/*<![CDATA[*/
// 2. Retrieve the JSON configuration from the model
// Thymeleaf escapes the JSON string, so we parse it back to an object
var chartConfig = /*[[${chartConfig}]]*/ {};
// 3. Initialize the chart with the configuration
Highcharts.chart('chartContainer', chartConfig);
/*]]>*/
</script>
</body>
</html>
Summary and Recommendation
| Approach | Best For | Pros | Cons |
|---|---|---|---|
| Manual String | Quick tests, one-off static charts. | No dependencies. | Error-prone, unreadable, unmaintainable. |
| JSON Library (Gson/Jackson) | Most projects. The standard, recommended approach. | Robust, readable, type-safe (with POJOs), widely used. | Requires adding a library dependency. |
| Java Wrapper (Highcharts-Java) | Complex charts, applications that generate many charts. | Most readable, type-safe, IDE-friendly, reduces boilerplate. | Adds a specific dependency, might be overkill for simple charts. |
For most new projects, start with a JSON library like Jackson (if you're in a Spring environment) or Gson. It provides the best balance of power, readability, and flexibility. If you find yourself writing a lot of chart configuration code, then consider investing time in learning the Highcharts-Java wrapper.
