Showing posts with label json. Show all posts
Showing posts with label json. Show all posts

Sunday, July 1, 2018

Generate POJO Class dari JSON mengunakan DTO Generator

Apa itu DTO Generator ?

DTO Generator adalah plugin Android Studio dan Intellij IDE yang digunakan untuk melakukan generate code dari JSON ke dalam bentuk POJO Class, plugin ini sangat membantu kita dalam menulis sebuah code dengan lebih cepat dan efisien.

Bagaimana installasi plugin di Android Studio / Intellij IDE ?
Buka File - Settings - Plugins pada Android Studio
Selanjutnya, browse repositories lalu cari DTO Generator pada search box, kemudian install dan restart

Bagaimana menggunakan DTO Generator?

Kasusnya kita akan membuat POJO Class dari json yang kita dapat, nah pertama yang harus dilakukan adalah membuat class baru di Android Studio.
Selanjutnya klik kanan generate lalu pilih DTO from JSON

Paste JSON pada tabs DTO Generator
Pilih Settings, lalu atur seperti dibawah ini

Keterangan :

1. Organize classes
  • Single file inner class : Membuat pojo class pada setiap objek dalam satu class
  • Separate file for each object : Membuat pojo class pada setiap objek dalam beda class
2. Type
  • Gson : Pojo class yang menggunakan library gson yang merupakan library java untuk serialize dan deserialize java object dari json atau sebaliknya
  • Jackson : Pojo class yang menggunakan library jackson yang merupakan library java untuk memproses JSON
  • Plain Class : Pojo class biasa
  • AutoValue : Pojo class yang menggunakan library AutoValue yang merupakan Library gson extension untuk membuat value types di java serta membantu mengurangi kode boilerplate yang terlibat dengan pembuatan tipe nilai.
  • Custom : Pojo class yang dimana kita dapat mengcustom sendiri anotasi pada setiap variabel
3. Encapsulation Option
  • Make fields private : Membuat field pada class menjadi private
  • Provide setter : Menambahkan method setter
  • Provide getter : Menambahkan method getter
3. Naming

  • Prefix field with : menambahkan field dengan prefix
  • Use camel case : menggunakan format penulisan camel case pada field

Jika semuanya sudah dirasa sesuai, pilih generate. Dan berikut adalah hasil dari generate POJO Class dari bentuk JSON


Sekian dari saya, semoga membantu :))

referensi :
https://github.com/nvinayshetty/DTOnator
https://www.slideshare.net/vinayhebballi/json-vs-gson-vs-jackson
https://medium.com/3xplore/autovalue-with-retrofit-2-0-61f9530787b1

Sunday, March 19, 2017

Currency Conversion With Gson

Pada kesempatan kali ini saya akan mencoba menuliskan cara mendapatkan kurs nilai tukar mata uang dengan menggunakan java dan gson sebagai library nya. 

Apa itu gson? gson adalah library yang diciptakan oleh si mbah google yang berfungsi untuk mengubah objek java menjadi sebuah objek json. 

Use case yang saya ambil adalah bagaimana mendapatkan informasi nilai tukar mata uang atau currency conversion dengan menggunakan API Provider http://api.fixer.io/

Karena kita menggunakan gson sebagai library tambahan, maka pastikan kalian sudah memiliki library tersebut, jika tidak kalian dapat men-download gson pada link berikut https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.0

Untuk melakukan konversi nilai tukar mata uang kita harus mendapatkan nilai rate-nya terlebih dahulu kemudian di-kalikan dengan nilai ammount, kita tidak perlu report memikirkan darimana datangnya hasil nilai rate, karena kita cukup menggunakan API Provider http://api.fixer.io/ yang sudah disediakan oleh google.

Berikut adalah contoh java untuk currency conversion

CurrencyConversionResponse.java

package gsontest;

import java.util.Map;
import java.util.TreeMap;


public class CurrencyConversionResponse {

 private String base;
 private String date;

 private Map rates = new TreeMap();

 public Map getRates() {
  return rates;
 }

 public void setRates(Map rates) {
  this.rates = rates;
 }

 public String getBase() {
  return base;
 }

 public void setBase(String base) {
  this.base = base;
 }

 public String getDate() {
  return date;
 }

 public void setDate(String date) {
  this.date = date;
 }

}




CurrencyConvertor.java

package gsontest;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;

import com.google.gson.Gson;

public class CurrencyConvertor {

 private static final String API_PROVDIER = "http://api.fixer.io/";

 public static double convert(String fromCurrencyCode, String toCurrencyCode) {

 if ((fromCurrencyCode != null && !fromCurrencyCode.isEmpty())
   && (toCurrencyCode != null && !toCurrencyCode.isEmpty())) {

  CurrencyConversionResponse response = 
   getResponse(API_PROVDIER + "/latest?base=" + fromCurrencyCode);

  if (response != null) {

   String rate = response.getRates().get(toCurrencyCode);

   double conversionRate = 
     Double.valueOf((rate != null) ? rate : "0.0");

   return conversionRate;
  }

 }

  return 0.0;
 }

 private static CurrencyConversionResponse getResponse(String strUrl) {

  CurrencyConversionResponse response = null;

  Gson gson = new Gson();
  StringBuffer sb = new StringBuffer();

  if (strUrl == null || strUrl.isEmpty()) {

   System.out.println("Application Error");
   return null;
  }

  URL url;
  try {
   url = new URL(strUrl);

   HttpURLConnection connection = 
     (HttpURLConnection) url.openConnection();

   InputStream stream = connection.getInputStream();

   int data = stream.read();

   while (data != -1) {

    sb.append((char) data);

    data = stream.read();
   }

   stream.close();

   response = gson.fromJson(sb.toString(), 
     CurrencyConversionResponse.class);

  } catch (MalformedURLException e) {

   System.out.println(e.getMessage());
   e.printStackTrace();

  } catch (IOException e) {

   System.out.println(e.getMessage());
   e.printStackTrace();
  }

  return response;
 }

 public static void main(String[] args) throws IOException {

  Scanner scanner = new Scanner(System.in);

  System.out.println("Enter the currency code ?");
  String fromCurrencyCode = scanner.next();

  System.out.println("Enter the Amount value:");
  double amount = scanner.nextDouble();

  System.out.println("Enter the Currency Code that you want to covert : ");
  String toCurrencyCode = scanner.next();

  fromCurrencyCode = fromCurrencyCode.toUpperCase();
  toCurrencyCode = toCurrencyCode.toUpperCase();
  
  double coversionRate = convert(fromCurrencyCode, toCurrencyCode);

  System.out.println(amount + " " + fromCurrencyCode + 
    " is equivalent to " + (coversionRate * amount) + " "
    + toCurrencyCode + " today.");

  scanner.close();
 }

}




Berikut hasil dari hasil currency conversion dari USD ke IDR


Kalian juga dapat melakukan currency conversion dengan soap service pada wsdl berikut http://www.webservicex.net/CurrencyConvertor.asmx

Berikut hasil currency conversion jika service tersebut kita coba jalankan dengan menggunakan soap-UI


Demikian blog saya kali ini, untuk referensi terkait blog ini dapat juga dilihat pada link berikut, see ya..


Friday, September 18, 2015

RESTFul web service dengan RESTEasy

Apa yang dibutuhkan untuk membuat API web service berbasis Restful?
Jika kita menggunakan java banyak sekali framework yang bisa digunakan untuk membuat Restful dari web application. Contohnya : Apache CFX, JAX-RS, Jersey, Spring MVC.
Yang paling populer menurut saya adalah Spring MVC. Karena  Spring Framework sudah cukup lengkap. Sudah menyediakan banyak fitur, seperti dependency injection, ORM support, MVC dan lain lain.
Tapi kalau kita hanya ingin membuat webservice API yang skalanya kecil. Menurut saya agak cukup rumit karena library dependency yang cukup banyak apalagi harus configurasi juga di ApplicationContext xml.
Ada sebuah library java yang biasa digunakan untuk membangun web application yang bisa mengekspose RestFull webservice API.
Kita akan mencoba Menggunakan RESTEasy. Library ini termasuk dalam JBoss project. Aplikasi kita tidak harus dijalankan diatas JBoss App server, bisa dijalankan di app server yang lain seperti (tomcat, jetty, dan lainnya). Sudah memenuhi standart spesifikasi JAX-RS.
Dokumentasinya ada di sini : https://jax-rs-spec.java.net/nonav/2.0-rev-a/apidocs/index.html
Intinya JAX-RS membantu kita untuk melakukan mapping java class (POJO) menjadi web resource
JAX-RS memiliki beberapa standar annotasi seperti berikut ini :
  • @Path specifies the relative path for a resource class or method.
  • @GET, @PUT, @POST, @DELETE and @HEAD specify the HTTP request type of a resource.
  • @Produces specifies the response Internet media type
  • @Consumes specifies the accepted request Internet media types.
Secara garis besar kita hanya membuat class java yang diberikan anotasi jax-rs dan didaftarkan di web.xml

Tambahkan maven dependency
 <dependency>  
       <groupId>org.jboss.resteasy</groupId>  
       <artifactId>resteasy-jaxrs</artifactId>  
       <version>3.0.4.Final</version>  
     </dependency>  
     <dependency>  
       <groupId>org.jboss.resteasy</groupId>  
       <artifactId>resteasy-jackson-provider</artifactId>  
       <version>3.0.4.Final</version>  
     </dependency>  

Sebagai contoh buat class pojo yang akan kita ekspos sebagai JSON di api kita
 public class Employee extends Base {  
   private String name;  
   private String email;  
   private String phone;  
   private String address;  
   public Employee() { }  
   public Employee(Integer id, String name, String email, String phone, String address) {  
     this.id = id;  
     this.name = name;  
     this.email = email;  
     this.phone = phone;  
     this.address = address;  
   }  
   public String getName() {  
     return name;  
   }  
   public void setName(String name) {  
     this.name = name;  
   }  
   public String getEmail() {  
     return email;  
   }  
   public void setEmail(String email) {  
     this.email = email;  
   }  
   public String getPhone() {  
     return phone;  
   }  
   public void setPhone(String phone) {  
     this.phone = phone;  
   }  
   public String getAddress() {  
     return address;  
   }  
   public void setAddress(String address) {  
     this.address = address;  
   }  
 }  

Buat class service employee yang bertugas untuk mengekpose endpoint yang kita perlukan. Misalnya kita akan membuat fungsi add, find, delete employee.
 import javax.ws.rs.*;  
 import javax.ws.rs.core.Response;  
 import java.util.ArrayList;  
 import java.util.List;  
 import java.util.logging.Logger;  
 @Path("/person")  
 public class EmployeeService {  
   private static final Logger LOGGER = Logger.getLogger(EmployeeService.class.getSimpleName());  
   private List<Employee> listEmployee = new ArrayList<Employee>();  
   public EmployeeService(){  
     listEmployee.add(new Employee(1, "budi", "budi@gmail.com", "081901444", "jakarta"));  
   }  
   @Path("/")  
   @Consumes("application/json")  
   @Produces("application/json")  
   @PUT  
   public Response addEmployee(Employee employee){  
     listEmployee.add(employee);  
     return Response.status(200).entity("new employee id "+employee.getId()).build();  
   }  
   @Path("/")  
   @Produces("application/json")  
   @GET  
   public Response findAllEmployee(){  
     return Response.status(200).entity(listEmployee).build();  
   }  
   @Path("/{id}")  
   @Produces("application/json")  
   @GET  
   public Response findById(@PathParam("id") Integer id){  
     Employee employee = listEmployee.get(id);  
     if(employee != null) return Response.status(200).entity(employee).build();  
     return Response.status(Response.Status.NOT_FOUND).build();  
   }  
   @Path("/{id}")  
   @Produces("application/json")  
   @DELETE  
   public Response DeleteById(@PathParam("id") int id){  
     Employee result = listEmployee.remove(id);  
     if(result != null) return Response.status(200).build();  
     return Response.status(Response.Status.NOT_FOUND).build();  
   }  
 }  

Register class service employes tadi ke dalam class jax-rs application (misalnya kita beri nama RestApplication).
 import javax.ws.rs.core.Application;  
 import java.util.HashSet;  
 import java.util.Set;  
 
 public class RestApplication extends Application {  
   private Set<Object> singletons = new HashSet<Object>();  
   public RestApplication() {  
     singletons.add(new EmployeeService());  
   }  
   @Override  
   public Set<Object> getSingletons() {  
     return singletons;  
   }  
 }  

Daftar class application tadi ke web.xml
 <?xml version="1.0" encoding="UTF-8"?>  
 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
   <!-- restEasy servlet config -->  
   <servlet-mapping>  
     <servlet-name>resteasy-servlet</servlet-name>  
     <url-pattern>/rest/*</url-pattern>  
   </servlet-mapping>  
   <!-- this should be the same URL pattern as the servlet-mapping property -->  
   <context-param>  
     <param-name>resteasy.servlet.mapping.prefix</param-name>  
     <param-value>/rest</param-value>  
   </context-param>  
   <servlet>  
     <servlet-name>resteasy-servlet</servlet-name>  
     <servlet-class>  
       org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher  
     </servlet-class>  
     <init-param>  
       <param-name>javax.ws.rs.Application</param-name>  
       <param-value>com.nostratech.gcm.notification.rest.RestApplication</param-value>  
     </init-param>  
   </servlet>  
   <session-config>  
     <session-timeout>  
       30  
     </session-timeout>  
   </session-config>  
 </web-app>  

Kita run web application kita (bisa dideploy diatas application server).

- GET /person/0
 {  
   "id": 1,  
   "version": null,  
   "name": "budi",  
   "email": "budi@gmail.com",  
   "phone": "081901444",  
   "address": "jakarta"  
 }  

- PUT /person/  (application/json)
 {  
   "id": 2,  
   "name": "andri",  
   "email": "andri@gmail.com",  
   "phone": "08190166",  
   "address": "bandung"  
 }  

- GET /person/

Referensi :
http://resteasy.jboss.org/ dan http://resteasy.jboss.org/docs
jax-rs spesifications : https://jax-rs-spec.java.net/nonav/2.0-rev-a/apidocs/index.html
source code (web app project yang menggunakan RestEasy) : https://bitbucket.org/andri_khrisharyadi/sample-gcm-sever

Terima kasih dan selamat belajar dan mencoba :)






Tuesday, September 16, 2014

REST Web Service Client menggunakan RestTemplate

Bagaimana untuk request ke sebuah Rest API dan mendapatkan hasilnya ?
Kalau di Java pada umumnya untuk memanggil ke Rest API digunakan class http client.

Misalnya ada Rest API seperti ini : http://host-01:8099/customer/271650
Return value berupa JSON seperti berikut ini :
 {  
 id: 271650,  
 name: "derp",  
 phone: "085635231",  
 email: "derp@herp.co.id",  
 corporateId: null,  
 voucherBalance: 0  
 }  

Nah, bagaimana caranya untuk mendapatkan data JSON tersebut agar bisa diolah lebih lanjut di class class lainnya.

Salah satu caranya kita bisa menggunakan class HttpURLConnection().
Berikut ini contohnya :
 package com.nostratech.app;  
 import java.io.BufferedReader;  
 import java.io.IOException;  
 import java.io.InputStreamReader;  
 import java.net.HttpURLConnection;  
 import java.net.MalformedURLException;  
 import java.net.URL;  
 public class SampleHttpClient {  
      public static void main(String[] args) {  
           try {  
                URL url = new URL(  
                          "http://host-01:8099/customer/271650/");  
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
                conn.setRequestMethod("GET");  
                conn.setRequestProperty("Accept", "application/json");  
                if (conn.getResponseCode() != 302 && conn.getResponseCode() != 200) {  
                     throw new RuntimeException("Failed : HTTP error code : "  
                               + conn.getResponseCode() + conn.getResponseMessage());  
                }  
                BufferedReader br = new BufferedReader(new InputStreamReader(  
                          (conn.getInputStream())));  
                String output;  
                System.out.println("JSON response : \n");  
                while ((output = br.readLine()) != null) {  
                     System.out.println(output);  
                }  
                conn.disconnect();  
           } catch (MalformedURLException e) {  
                e.printStackTrace();  
           } catch (IOException e) {  
                e.printStackTrace();  
           }  
      }  
 }  

Responsenya akan berupa string JSON, yang seperti ini.


Kemudian string json ini harus kita parsing manual satu per satu agar kita olah lagi.
Tentu hal ini akan terasa lebih rumit dan agak memakan waktu.

Salah satu cara untuk mempermudah request dan parsing json dari Rest API, adalah menggunakan library tambahan RestTemplate dari Spring Framework. Sebenarnya library ini digunakan di android project, tetapi bisa juga digunakan di Java project lainnya.

RestTemplate ini sudah mensupport hampir semua Http Method yang biasa digunakan di Rest API (POST, PUT, DELETE, GET dan lain-lain).

Langkahnya sangat mudah.
Tinggal tambahkan library (spring web dan core) ini ke java project kita (bisa didownload di sini ) :
spring-core-4.0.7.RELEASE.jar
spring-web-4.0.7.RELEASE.jar

Jangan lupa tambahkan juga library Jackson (download di sini). digunakan untuk parsing atau marshalling json resultnya.
jackson-annotations-2.3.2.jar (link)
jackson-core-2.3.2.jar (link)
jackson-mapper-asl-1.9.13.jar (link)

tambahkan class common-logging : commons-logging-1.1.3.jar (link)

Kita harus tahu dulu bagaimana format json responsenya. Kemudian dibuat class mappingnya (contohnya class : Customer) yang digunakan sebagai object hasil mapping json resultnya.
Atribut atributnya disamakan dengan json response, karena akan digunakan sebagai mapping
 package com.nostratech.app;  
 import java.math.BigDecimal;  
 public class Customer {  
      private Integer id;  
      private String name;  
      private String phone;  
      private String email;  
      private Integer corporateId;  
      private BigDecimal voucherBalance;  
      public Integer getId() {  
           return id;  
      }  
      public void setId(Integer id) {  
           this.id = id;  
      }  
      public String getName() {  
           return name;  
      }  
      public void setName(String name) {  
           this.name = name;  
      }  
      public String getPhone() {  
           return phone;  
      }  
      public void setPhone(String phone) {  
           this.phone = phone;  
      }  
      public String getEmail() {  
           return email;  
      }  
      public void setEmail(String email) {  
           this.email = email;  
      }  
      public Integer getCorporateId() {  
           return corporateId;  
      }  
      public void setCorporateId(Integer corporateId) {  
           this.corporateId = corporateId;  
      }  
      public BigDecimal getVoucherBalance() {  
           return voucherBalance;  
      }  
      public void setVoucherBalance(BigDecimal voucherBalance) {  
           this.voucherBalance = voucherBalance;  
      }  
      @Override  
      public String toString() {  
           return "Customer [id=" + id + ", name=" + name + ", phone=" + phone  
                     + ", email=" + email + ", corporateId=" + corporateId  
                     + ", voucherBalance=" + voucherBalance + "]";  
      }  
 }  

Kemudian kita buat class sample rest client.
Ditambahkan juga MessageConverter untuk convert dari json string ke object.
Kita gunakan MappingJackson2HttpMessageConverter() sebagai converternya.
 package com.nostratech.app;  
 import java.util.ArrayList;  
 import java.util.List;  
 import org.springframework.web.client.RestTemplate;  
 import org.springframework.http.converter.HttpMessageConverter;  
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;  
 public class SampleRestClient {  
      public static void main(String[] args) {  
           String url = "http://host-01:8099/customer/271650";  
           RestTemplate restTemplate = new RestTemplate();  
           List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();  
           messageConverters.add(new MappingJackson2HttpMessageConverter());  
           restTemplate.getMessageConverters().addAll(messageConverters);  
           Customer customer = restTemplate.getForObject(url, Customer.class);  
           System.out.println("Result customer : "+customer);  
      }  
 }  

Hasilnya kurang lebih akan seperti ini setelah di running.
Ouput json sudah menjadi object Customer.


Terima kasih, semoga membantu.

Selamat mencoba.