Problema com salvar \\/ num json

4 respostas
java
C

Problema de java set para chamar o campo Date em API

package controllers;

import java.io.IOException;

import java.io.StringWriter;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.google.gson.JsonObject;

import controllers.commons.BaseService;

import dto.ReservationDTO;

import play.Play;

import <a href="http://play.libs.WS">play.libs.WS</a>;

import play.libs.WS.HttpResponse;

import play.libs.WS.WSRequest;

import play.mvc.results.RenderJson;
import com.fasterxml.jackson.databind.JsonNode;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.SerializationFeature;
import okhttp3.FormBody;

import okhttp3.HttpUrl;

import okhttp3.MediaType;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.RequestBody;

import okhttp3.Response;
public class TestDriveSchedule  extends BaseService {	

public static void saveTestDriveSchedule() {

OkHttpClient client = new OkHttpClient.Builder().build();

String urlSave = Play.configuration.getProperty(testdrive.url)+Play.configuration.getProperty(testdrive.saveSchedule.url);

HttpUrl url = HttpUrl.parse(urlSave).newBuilder().build();

String oauthToken = session.get(oauthToken);

Request request = new Request.Builder()

.method(OPTIONS, null)

.url(url.toString())

.header(Accept, application/json)

.header(Authorization, "Bearer " + oauthToken)

.header(APIKey, Play.configuration.getProperty(testdrive.api.key))

.header(X-CSRF-Token, fetch)

.build();

Response response;

try {

response = client.newCall(request).execute();

String csrfToken = response.header(X-CSRF-Token);

ObjectMapper mapper = new ObjectMapper();

ReservationDTO dto = createReservationObj(new Date());

StringWriter stringEmp = new StringWriter();

mapper.configure(SerializationFeature.INDENT_OUTPUT, true);

mapper.writeValue(stringEmp, dto);

RequestBody body = RequestBody.create(MediaType.get(application/json), stringEmp.toString());

JsonNode nodeR = mapper.readTree(stringEmp.toString());
Request request2 = new Request.Builder()
        		
        .url(url.toString())
        .header("Content-Type", "application/json")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer " + oauthToken)    
        .header("APIKey", Play.configuration.getProperty("testdrive.api.key"))
        .header("X-CSRF-Token", csrfToken)
        .post(body)
        .build();                
        
        response = client.newCall(request2).execute();
        JsonNode node = mapper.readTree(response.body().string()); 
        renderJSON(node);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		renderJSON(e.getMessage());
	}
      
}

private static ReservationDTO createReservationObj(Date date) {
	date.setTime(1545350400000L);
	ReservationDTO reservation = new ReservationDTO();
    reservation.IBukrs = "0001";
    reservation.IStatus = "1";
    reservation.IKunnr = "B05AC00001";
    
    ReservationDTO.IReserv iReserv = reservation.new IReserv();
    iReserv.Zcvin = "9BHBH51DBCP000248";
    iReserv.Partner = "248";
    iReserv.Zccuno = "1111";
    iReserv.Zconpo = "H";
    String td = String.format("\\/Date(%d)\\/", date.getTime());
    
    iReserv.Rdate = td.toString();
    iReserv.Rtime5 = "X";
    iReserv.Status = "R";
    iReserv.ZcommtR = "teste";
    iReserv.Kunnr = "B05AC00001";

    reservation.IReserv = iReserv;    

    return reservation;
}

}

O quando salvo o json ele esta com as duas barras invertidas isso esta pessimo.

Alguém pode me ajudar a salvar uma só

4 Respostas

L

A barra invertida é um char especial no JSON e deve ser escapado. Não tem problema aparecer as duas barras no JSON. Quando for mostrar pro usuário, essa barra desaparece.

C

O problema é que quando estou enviando para o SAP ele esta considerando duas \

C

Quando envio o Json {“IBukrs”:“0001”,“IKunnr”:“B05AC00001”,“IStatus”:“1”,“IRsvno”:null,“EReserv”:null,“IReserv”:{“Zcvin”:“9BHBH51DBCP000248”,“Partner”:“248”,“Zccuno”:“1111”,“Zconpo”:“H”,“Status”:“R”,“Rdate”:"\/Date(1545350400000)\/",“Rtime1”:null,“Rtime2”:null,“Rtime3”:null,“Rtime4”:null,“Rtime5”:“X”,“Ddate”:null,“Dtime”:null,“Zcretyno”:null,“ZcretynoName”:null,“Zcommt”:null,“ZcommtR”:“teste”,“ZcommtC”:null,“ZcommtCr”:null,“Rsvno”:null,“Zwash”:null,“Kunnr”:“B05AC00001”}}

funciona corretamente

quando envio o json gerado pela aplicação:

{“IBukrs”:“0001”,“IKunnr”:“B05AC00001”,“IStatus”:“1”,“IRsvno”:null,“EReserv”:null,“IReserv”:{“Zcvin”:“9BHBH51DBCP000248”,“Partner”:“248”,“Zccuno”:“1111”,“Zconpo”:“H”,“Status”:“R”,“Rdate”:"\\/Date(1545350400000)\\/",“Rtime1”:null,“Rtime2”:null,“Rtime3”:null,“Rtime4”:null,“Rtime5”:“X”,“Ddate”:null,“Dtime”:null,“Zcretyno”:null,“ZcretynoName”:null,“Zcommt”:null,“ZcommtR”:“teste”,“ZcommtC”:null,“ZcommtCr”:null,“Rsvno”:null,“Zwash”:null,“Kunnr”:“B05AC00001”}}

não funciona

S

Isso é um problema comum, o método toString() da classe JsonObject sempre escapa as barras.
Você não postou o código onde de fato envia a String obtida de seu objeto JsonObject, mas sugiro enviar assim:

String stringParaEnviar = meuObjetoJson.toString().replace("\\\\","\\");
Criado 14 de dezembro de 2018
Ultima resposta 14 de dez. de 2018
Respostas 4
Participantes 3