En el Post anterior de java y json hemos utilizado la librería de google para generar una estructura JSON a partir de una lista de personas .En este Post realizaremos la operación contraria y utilizaremos un Servlet para leer datos de nos llegan en formato JSON y convertirlos de forma sencilla en objetos para imprimirlos en HTML.
Java y JSON con un Servlet
Vamos a ver el código del Servlet que lee datos JSON .
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.arquitecturajava.negocio.Persona;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonReader;
public class ServletLeerJSON extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
URLConnection conexion = new URL("http://localhost:8080/JSONServlet/ServletJSon").openConnection();
conexion.connect();
JsonReader lector = new JsonReader(new InputStreamReader(
conexion.getInputStream()));
JsonParser parseador = new JsonParser();
JsonElement raiz = parseador.parse(lector);
Gson json = new Gson();
JsonArray lista = raiz.getAsJsonArray();
for (JsonElement elemento : lista) {
Persona persona = json.fromJson(elemento, Persona.class);
System.out.println(persona.getNombre());
}
PrintWriter pw=response.getWriter();
pw.write("funciona");
pw.close();
}
}
El código se encarga en primer lugar de abrir una conexión a la URL que almacena los datos en JSON:
URLConnection conexion = new URL("http://localhost:8080/JSONServlet/ServletJSon").openConnection();
conexion.connect();
Una vez realizada esta operación usamos un JsonReader para leer la información a traves de un InputStreamReader .Hecho esto usamos la clase JsonParser para parsear la estructura y convertirla en un JsonElement.
JsonReader lector = new JsonReader(new InputStreamReader( conexion.getInputStream())); JsonParser parseador = new JsonParser(); JsonElement raiz = parseador.parse(lector);
Por último recorremos la estructura y la convertimos en objetos java que serán impresos en un documento HTML clásico.
Gson json = new Gson();
JsonArray lista = raiz.getAsJsonArray();
for (JsonElement elemento : lista) {
Persona persona = json.fromJson(elemento, Persona.class);
System.out.println(persona.getNombre());
}
PrintWriter pw=response.getWriter();
pw.write("funciona");
pw.close();
Realizadas estas operaciones el servlet nos imprime los datos convertidos


Saludos, me gusto mucho el articulo y comento que estoy realizando un ejercicio de golang con json y un java con json.
El codigo del golang es el siguiente y funciona correctamente, tanto que responde con postman.
package main
import (
“encoding/json”
“log”
“net/http”
“github.com/gorilla/mux”
)
type Person struct {
ID string `json:”id,omitempty”`
FirstName string `json:”firstname,omitempty”`
LastName string `json:”lastname,omitempty”`
Address *Address `json:”address,omitempty”`
}
type Address struct {
City string `json:”city,omitempty”`
State string `json:”state,omitempty”`
}
var people []Person
// EndPoints
func GetPersonEndpoint(w http.ResponseWriter, req *http.Request){
params := mux.Vars(req)
for _, item := range people {
if item.ID == params[“id”] {
json.NewEncoder(w).Encode(item)
return
}
}
json.NewEncoder(w).Encode(&Person{})
}
func GetPeopleEndpoint(w http.ResponseWriter, req *http.Request){
json.NewEncoder(w).Encode(people)
}
func CreatePersonEndpoint(w http.ResponseWriter, req *http.Request){
params := mux.Vars(req)
var person Person
_ = json.NewDecoder(req.Body).Decode(&person)
person.ID = params[“id”]
people = append(people, person)
json.NewEncoder(w).Encode(people)
}
func DeletePersonEndpoint(w http.ResponseWriter, req *http.Request) {
params := mux.Vars(req)
for index, item := range people {
if item.ID == params[“id”] {
people = append(people[:index], people[index + 1:]…)
break
}
}
json.NewEncoder(w).Encode(people)
}
func main() {
router := mux.NewRouter()
// adding example data
people = append(people, Person{ID: “1”, FirstName:”Ryan”, LastName:”Ray”, Address: &Address{City:”Dubling”, State:”California”}})
people = append(people, Person{ID: “2”, FirstName:”Maria”, LastName:”Ray”})
// endpoints
router.HandleFunc(“/people”, GetPeopleEndpoint).Methods(“GET”)
router.HandleFunc(“/people/{id}”, GetPersonEndpoint).Methods(“GET”)
router.HandleFunc(“/people/{id}”, CreatePersonEndpoint).Methods(“POST”)
router.HandleFunc(“/people/{id}”, DeletePersonEndpoint).Methods(“DELETE”)
log.Fatal(http.ListenAndServe(“:3000”, router))
}
El codigo java, para es:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
public class ConsumeJson {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// String webService = “http://uk-postcodes.com/postcode/SE29TD.json”;
String webService = “localhost:3000/people/1”;
URL url = new URL(webService);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“GET”);
conn.setRequestProperty(“ACCEPT”, “application/json”);
if (conn.getResponseCode()==200){
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String output;
System.out.println(“output is_________________”);
while ((output = br.readLine()) != null);{
System.out.println(output);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
La inquietud es la siguiente, al ejecutar o probar da el error: java.net.MalformedURLException: unknown protocol: localhost
Estoy leyendo N cantidad de articulos, honestamente no entiendo.
Si tienen alguna idea, importante, estoy combinando dos lenguajes, es un ejercicio de prueba, para corroborar eficiencia y flexibilidad en construcción.
Mil Gracias de antemano….
Saludos.
Es buena, siempre usé framworks más complicados, pero en apuros, iría genial.
Como se abre la URL que necesita datos enviados con metodo POST.
Apoyandote en otros métodos de urlconnection :http://www.xyzws.com/javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139
¿Se puede descargar este ejemplo?
Estoy intentando mejorar ahora esas cosas y poner en los nuevos artículos el código .. pero este ya tiene un tiempo. Te ha valido al final con el código del articulo?
En mi caso hize un ejemplo con String Reader, el cual recibe una String en formato Json y lo transforma al lector, de ahi en adelante todo es igual
JsonReader lector = new JsonReader(new StringReader( jsonStringList));
El api es bastante flexible 🙂