Reputation: 23
I have following json object and I want to map this json into java object please help me.
{
"address": {
"building": "1007",
"coord": [
-73.856077,
40.848447
],
"street": "Morris Park Ave",
"zipcode": "10462"
},
"borough": "Bronx",
"cuisine": "Bakery",
"grades": [
{
"date": {
"$date": 1393804800000
},
"grade": "A",
"score": 2
},
{
"date": {
"$date": 1378857600000
},
"grade": "A",
"score": 6
},
{
"date": {
"$date": 1358985600000
},
"grade": "A",
"score": 10
},
{
"date": {
"$date": 1322006400000
},
"grade": "A",
"score": 9
},
{
"date": {
"$date": 1299715200000
},
"grade": "B",
"score": 14
}
],
"name": "Morris Park Bake Shop",
"restaurant_id": "30075445"
}
When I use scala printschema methot it shows like below, Please help me to map this schema with java object.
root
|-- address: struct (nullable = true)
| |-- building: string (nullable = true)
| |-- coord: array (nullable = true)
| | |-- element: double (containsNull = true)
| |-- street: string (nullable = true)
| |-- zipcode: string (nullable = true)
|-- borough: string (nullable = true)
|-- cuisine: string (nullable = true)
|-- grades: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- date: struct (nullable = true)
| | | |-- $date: long (nullable = true)
| | |-- grade: string (nullable = true)
| | |-- score: long (nullable = true)
|-- name: string (nullable = true)
|-- restaurant_id: string (nullable = true)
Upvotes: 0
Views: 2934
Reputation: 1552
I guess the intention is to create Java Object from json String.Its going to be a long one but pretty easy to implement. This solution is based on Jackson API.ObjectMapper is the main api used for data-binding.
Step 1 : Include jackson in maven dependency if you are using pom.xml otherwise download respective jar files from maven repository https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>
Step 2: Create POJO Classes.These object will be created from JSON.
We need POJO's for below and will take the structure below,
AddressDetails
Address
Grades
Grade
Date
I will add the code for POJO's bottom up.
Date :
package org.personal.TestProject.jsontoobject;
public class Date {
private float $date;
// Getter Methods
public float get$date() {
return $date;
}
// Setter Methods
public void set$date(float $date) {
this.$date = $date;
}
}
Grade :
package org.personal.TestProject.jsontoobject;
public class Grade {
Date date = new Date();
private String grade;
private float score;
// Getter Methods
public float getScore() {
return score;
}
public String getGrade() {
return grade;
}
public Date getDate() {
return date;
}
// Setter Methods
public void setScore(float score) {
this.score = score;
}
public void setGrade(String grade) {
this.grade = grade;
}
public void setDate(Date date) {
this.date = date;
}
}
Grades:
package org.personal.TestProject.jsontoobject;
import java.util.ArrayList;
import java.util.List;
import org.personal.TestProject.jsontoobject.Grade;
public class Grades {
private List<Grade> grades = new ArrayList<Grade>();
public List<Grade> getGrades() {
return grades;
}
public void setGrades(List<Grade> grades) {
this.grades = grades;
}
}
Address:
package org.personal.TestProject.jsontoobject;
import java.util.ArrayList;
import java.util.List;
public class Address {
private String building;
List<Float> coord = new ArrayList<Float>();
private String street;
private String zipcode;
// Getter Methods
public String getBuilding() {
return building;
}
public List<Float> getCoords() {
return coord;
}
public String getStreet() {
return street;
}
public String getZipcode() {
return zipcode;
}
// Setter Methods
public void setBuilding(String building) {
this.building = building;
}
public void setCoord(List<Float> coord) {
this.coord = coord;
}
public void setStreet(String street) {
this.street = street;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
}
AddressDetails :
package org.personal.TestProject.jsontoobject;
import java.util.ArrayList;
import java.util.List;
import org.personal.TestProject.jsontoobject.Grade;
import org.personal.TestProject.jsontoobject.Address;
public class AddressDetails {
Address address = new Address();
private String borough;
private String cuisine;
List<Grade> grades = new ArrayList<Grade>();
private String name;
private String restaurant_id;
//Setters
public List<Grade> getGrades() {
return grades;
}
public Address getAddress() {
return address;
}
public String getBorough() {
return borough;
}
public String getCuisine() {
return cuisine;
}
public String getName() {
return name;
}
public String getRestaurant_id() {
return restaurant_id;
}
//Getters
public void setGrades(List<Grade> grades) {
this.grades = grades;
}
public void setAddress(Address address) {
this.address = address;
}
public void setBorough(String borough) {
this.borough = borough;
}
public void setCuisine(String cuisine) {
this.cuisine = cuisine;
}
public void setName(String name) {
this.name = name;
}
public void setRestaurant_id(String restaurant_id) {
this.restaurant_id = restaurant_id;
}
}
Step 3: We use ObjectMapper to convert json(file or String) into an Object.Now you may use getters to access fields from the object as desired.
package org.personal.TestProject.jsontoobject;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.personal.TestProject.jsontoobject.AddressDetails;
public class ReadJsonFile {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
String json = "{\n" +
" \"address\": {\n" +
" \"building\": \"1007\",\n" +
" \"coord\": [\n" +
" -73.856077,\n" +
" 40.848447\n" +
" ],\n" +
" \"street\": \"Morris Park Ave\",\n" +
" \"zipcode\": \"10462\"\n" +
" },\n" +
" \"borough\": \"Bronx\",\n" +
" \"cuisine\": \"Bakery\",\n" +
" \"grades\": [\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1393804800000\n" +
" },\n" +
" \"grade\": \"A\",\n" +
" \"score\": 2\n" +
" },\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1378857600000\n" +
" },\n" +
" \"grade\": \"A\",\n" +
" \"score\": 6\n" +
" },\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1358985600000\n" +
" },\n" +
" \"grade\": \"A\",\n" +
" \"score\": 10\n" +
" },\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1322006400000\n" +
" },\n" +
" \"grade\": \"A\",\n" +
" \"score\": 9\n" +
" },\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1299715200000\n" +
" },\n" +
" \"grade\": \"B\",\n" +
" \"score\": 14\n" +
" }\n" +
" ],\n" +
" \"name\": \"Morris Park Bake Shop\",\n" +
" \"restaurant_id\": \"30075445\"\n" +
"}";
AddressDetails value = null;
try {
value = mapper.readValue(json, AddressDetails.class);
// For converting a json file to object use below code
//value = mapper.readValue(new File("result.json"), AddressDetails.class);
// Use getter methods to Access any fields on the object
System.out.println("Restaurant ID " +value.getRestaurant_id());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Upvotes: 0
Reputation: 29185
If you wan to convert json string to java you can use Gson..
Gson g = new Gson(); yourvenillabean p = g.fromJson(jsonString, yourvanillabean.class)
see complete example here
Read more here
since you added spark tag If I am right the below is spark way of handling json if you wan to create a dataframe...
you can convert this json in to DataFrame like below
package examples;
import org.apache.spark.SparkConf;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.SparkSession;
import java.util.Arrays;
import java.util.List;
public class JsonDF {
SparkSession sparkSession;
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local[2]");
SparkSession spark = SparkSession
.builder()
.appName("Dataset-json")
.master("local[4]")
.getOrCreate();
System.out.println("Session created");
String str = "{\n" +
" \"address\": {\n" +
" \"building\": \"1007\",\n" +
" \"coord\": [\n" +
" -73.856077,\n" +
" 40.848447\n" +
" ],\n" +
" \"street\": \"Morris Park Ave\",\n" +
" \"zipcode\": \"10462\"\n" +
" },\n" +
" \"borough\": \"Bronx\",\n" +
" \"cuisine\": \"Bakery\",\n" +
" \"grades\": [\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1393804800000\n" +
" },\n" +
" \"grade\": \"A\",\n" +
" \"score\": 2\n" +
" },\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1378857600000\n" +
" },\n" +
" \"grade\": \"A\",\n" +
" \"score\": 6\n" +
" },\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1358985600000\n" +
" },\n" +
" \"grade\": \"A\",\n" +
" \"score\": 10\n" +
" },\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1322006400000\n" +
" },\n" +
" \"grade\": \"A\",\n" +
" \"score\": 9\n" +
" },\n" +
" {\n" +
" \"date\": {\n" +
" \"$date\": 1299715200000\n" +
" },\n" +
" \"grade\": \"B\",\n" +
" \"score\": 14\n" +
" }\n" +
" ],\n" +
" \"name\": \"Morris Park Bake Shop\",\n" +
" \"restaurant_id\": \"30075445\"\n" +
"}";
List<String> data = Arrays.asList(str);
Dataset<String> ds = spark.createDataset(data, Encoders.STRING());
spark.read().json(ds).show(false);
}
}
Result :
+-------------------------------------------------------+-------+-------+-------------------------------------------------------------------------------------------------------------------------------+---------------------+-------------+
|address |borough|cuisine|grades |name |restaurant_id|
+-------------------------------------------------------+-------+-------+-------------------------------------------------------------------------------------------------------------------------------+---------------------+-------------+
|[1007, [-73.856077, 40.848447], Morris Park Ave, 10462]|Bronx |Bakery |[[[1393804800000], A, 2], [[1378857600000], A, 6], [[1358985600000], A, 10], [[1322006400000], A, 9], [[1299715200000], B, 14]]|Morris Park Bake Shop|30075445 |
+-------------------------------------------------------+-------+-------+-------------------------------------------------------------------------------------------------------------------------------+---------------------+-------------+
Since you want to convert json to java class you can use this to do that with your json string...
After convertion you can get a class like this:
public class Application {
Address AddressObject;
private String borough;
private String cuisine;
ArrayList<Object> grades = new ArrayList<Object>();
private String name;
private String restaurant_id;
// Getter Methods
public Address getAddress() {
return AddressObject;
}
public String getBorough() {
return borough;
}
public String getCuisine() {
return cuisine;
}
public String getName() {
return name;
}
public String getRestaurant_id() {
return restaurant_id;
}
// Setter Methods
public void setAddress( Address addressObject ) {
this.AddressObject = addressObject;
}
public void setBorough( String borough ) {
this.borough = borough;
}
public void setCuisine( String cuisine ) {
this.cuisine = cuisine;
}
public void setName( String name ) {
this.name = name;
}
public void setRestaurant_id( String restaurant_id ) {
this.restaurant_id = restaurant_id;
}
}
public class Address {
private String building;
ArrayList<Object> coord = new ArrayList<Object>();
private String street;
private String zipcode;
// Getter Methods
public String getBuilding() {
return building;
}
public String getStreet() {
return street;
}
public String getZipcode() {
return zipcode;
}
// Setter Methods
public void setBuilding( String building ) {
this.building = building;
}
public void setStreet( String street ) {
this.street = street;
}
public void setZipcode( String zipcode ) {
this.zipcode = zipcode;
}
}
which is compatible to the spark schema you got..
root
|-- address: struct (nullable = true)
| |-- building: string (nullable = true)
| |-- coord: array (nullable = true)
| | |-- element: double (containsNull = true)
| |-- street: string (nullable = true)
| |-- zipcode: string (nullable = true)
|-- borough: string (nullable = true)
|-- cuisine: string (nullable = true)
|-- grades: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- date: struct (nullable = true)
| | | |-- $date: long (nullable = true)
| | |-- grade: string (nullable = true)
| | |-- score: long (nullable = true)
|-- name: string (nullable = true)
|-- restaurant_id: string (nullable = true)
Here is an example of How to create a Dataframe in spark that contains complex Java Beans
Upvotes: 1