关于Java跨域Json字符转类对象的方法示例

前言

JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换形式,是一种XML的替代方案,而且比XML更小,更快而且更易于解析。因为JSON描述对象的时候使用的是JavaScript语法,它是语言和平台独立的,并且这些年许多JSON的解析器和类库被开发出来。

JSON具有以下这些形式:

对象是一个无序的“‘名称/值'对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值' 对”之间使用“,”(逗号)分隔。

值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。

这些都是常见的数据结构。目前,绝大部分编程语言都以某种形式支持它们。这使得在各种编程语言之间交换同样格式的数据成为可能。

对于从其他服务器的url获得数据,我们一般都为json数据传输,比如服务器B要从服务器A的url获得分页信息,得到json字符后如果可以方便快捷操作要转为自己的java对象。

在此我试过三种转json的第三方,一种google的gson,这种好像无法转成功,一直报json格式错误,但校验一直通过正确,尝试失败。第二种是net.sf.json的,这种就是无报错,但是对象的值一直为空。只有json-simple可以成功转对象

解析json

首先,我们要解析json,查看json是否为标准的json格式,我们可以在网上的很多在线格式化查看json,解析json为对象一般都换汤不换药。

第一:就是要知道json结构,这里我先开启服务器A从他的url得到一串json数据。

把复制json数据把它扔在格式化工具可以很清楚的看出结构:

{
 "eventList": [
 {
  "id": 1030,
  "eventId": "1508779115818499700",
  "createTime": 1508779115000,
  "endTime": 1508865480000,
  "eventContent": "123",
  "openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
 },
 {
  "id": 1029,
  "eventId": "1508382907251660498",
  "createTime": 1508382906000,
  "endTime": 1508383020000,
  "eventContent": "ahhhhh",
  "openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
 },
 {
  "id": 1028,
  "eventId": "1508308708414580378",
  "createTime": 1508308721000,
  "endTime": 1508309040000,
  "eventContent": "30",
  "openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
 },
 {
  "id": 1027,
  "eventId": "1508308463330664814",
  "createTime": 1508308480000,
  "endTime": 1508308560000,
  "eventContent": "28",
  "openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
 },
 {
  "id": 1026,
  "eventId": "1508308463017144213",
  "createTime": 1508308479000,
  "endTime": 1508308560000,
  "eventContent": "27",
  "openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
 }
 ],
 "page": "1",
 "size": "5",
 "isHasPage": "1"
}

第二:根据结构创建对应的实体类

import com.yhn.consumer.entity.Event;
import lombok.Data;
import org.json.simple.JSONObject;
import java.io.Serializable;
import java.util.List;
@Data
public class EventVO implements Serializable{
 private List<Event> eventList;
 private String page;
 private String size;
 private String isHasPage;
 public EventVO(JSONObject object){ //构造器方法给对象赋值
 eventList = (List<Event>)object.get("eventList");
 page = (String)object.get("page");
 size = (String)object.get("size");
 isHasPage = (String)object.get("isHasPage");
 }
}

因为是内嵌结构,下面这个是private List<Event> eventList中的Event类;

import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.Date;
@Entity
@Data
@DynamicUpdate //自动更新时间字段
public class Event implements Serializable { //这是EventVO里List中的Event
 @Id
 @GeneratedValue
 private Integer id; //排序作用
 private String eventId; //事件id
 private Date createTime; //创建时间
 private Date endTime; //更新时间
 private String eventContent; //提醒事件内容
 private String openid; //用户id
}

测试类

接下来结构也写好了,将在服务器B写单元测试看看是否能够成功赋值

 @Test
 public void clientDemo()throws Exception {
 StringBuilder json = new StringBuilder();
  URL urlObject = new URL("http://127.0.0.1/meetingSign/test/server?openid=o4eWZ06xzHW6mc2gMZMYVDEtx1zk&page=2&size=5"); //指定URL
  HttpURLConnection uc = (HttpURLConnection) urlObject
   .openConnection(); //开启连接
  BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(), "utf-8"));
  String inputLine = null;
  while ((inputLine = in.readLine()) != null) {
  json.append(inputLine); //拼接json
  }
  in.close();
  uc.disconnect();
  System.out.println(json); //查看是否拿到。
  //去除可能含编码UTF-8等,因为可能含有Bom头文件。
  String result = formatString(json.toString());
  JSONParser parser=new JSONParser();
  org.json.simple.JSONObject data = new org.json.simple.JSONObject();
  data = (org.json.simple.JSONObject) parser.parse(result);
  EventVO eventVO = new EventVO(data); //把值传进去
  log.info("eventVO={}",eventVO);
 }
 /**
 * 去除bom报头
 */
 public static String formatString(String s) {
 if (s != null) {
  s = s.replaceAll("\ufeff", "");
 }
 return s;
 }

测试结果

是成给对象赋值了

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • java中实体类和JSON对象之间相互转化

    在需要用到JSON对象封装数据的时候,往往会写很多代码,也有很多复制粘贴,为了用POJO的思想我们可以装JSON转化为实体对象进行操作 package myUtil; import java.io.IOException; import myProject.Student; import myProject.StudentList; import org.codehaus.jackson.map.ObjectMapper; import org.json.JSONArray; import or

  • 详解Java Ajax jsonp 跨域请求

    1.什么是JSONP 一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP.用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析. JSONP是

  • 详解Ajax跨域(jsonp) 调用JAVA后台

    1. JSONP定义 JSONP是英文JSON with Padding的缩写,是一个非官方的协议.它允许在服务器端生成script tags返回至客户端,通过javascript callback的形式来实现站点访问. JSONP是一种script tag的注入,将server返回的response添加到页面实现特定功能. 2.JSONP由来 要解释JSONP的来由,先要说一下浏览器的"同源策略(SOP:Same Origin Policy)". 简而言之,就是浏览器限制脚本程序只能

  • json转String与String转json及判断对象类型示例代码

    复制代码 代码如下: function ajaxGetMenuList(){ $.getJSON("login.do", function(json){ var r = ""; zNodes += "["; $(json.menuList).each(function(i){ r = json.menuList[i]; if(i>0) zNodes += ","; zNodes += '{'; zNodes += 'id

  • 详解java 中Spring jsonp 跨域请求的实例

    详解java 中Spring jsonp 跨域请求的实例 jsonp介绍 JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSO

  • 关于Java跨域Json字符转类对象的方法示例

    前言 JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换形式,是一种XML的替代方案,而且比XML更小,更快而且更易于解析.因为JSON描述对象的时候使用的是JavaScript语法,它是语言和平台独立的,并且这些年许多JSON的解析器和类库被开发出来. JSON具有以下这些形式: 对象是一个无序的"'名称/值'对"集合.一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"

  • Java跨域问题的处理详解

    前言 相信大家在写前端脚本的时候经常会遇到发送数据到后台的情况,但是由于浏览器的限制,不同域名之间的数据是不能互相访问的,那前端怎么和后端如何进行数据之间的交换呢? JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题? 答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策略.那么什么是同源呢?所谓的同源是指三个方面"相同": 域名相同 协议相同 端口相同 下面就举几个例子来帮助更好的理解同源策略.

  • Java 跨域问题的处理方式

    问题 在页面上要使用 Ajax 请求去获取另外一个服务的数据,由于浏览器的 同源策略,所以直接请求会得到一个 Error. Failed to load https://www.baidu.com/: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. If an o

  • Java中类转json的基类实现

    类转json的基类实现 项目地址 github地址 实现原理 使用反射获取类的属性名和属性内容.具体原理可以自己查一下资料 对一个类调用getClass().getDeclaredFields()可以获取许多信息. 通过上述方法获取到的是一个Field类型的数组,这个类中有多少属性就有多少field,包括用private修饰的属性. 调用field.getName即可获得string类型的属性名,如下 for(Field field : fields){ String name = field.

  • 使用postMesssage()实现跨域iframe页面间的信息传递方法

    由于web同源策略的限制,当页面使用跨域iframe链接时,主页面与子页面是无法交互的,这对页面间的信息传递造成了不小的麻烦,经过一系列的尝试,最后我发现有以下方法可以实现: 1. 子页面url传参 简单说来就是把所有需要传递的参数加到与主页面同源的url上,将子页面重定向到该url,然后主页面通过iframe的src获取这些参数 过程非常复杂,不建议使用这种方法 2. postMessage() postMesssage()是HTML5提供的一个基于事件的消息传输API,可以实现跨文本档.多窗

  • Ajax跨域访问Cookie丢失问题的解决方法

    ajax跨域访问,可以使用jsonp方法或设置Access-Control-Allow-Origin实现,关于设置Access-Control-Allow-Origin实现跨域访问可以参考之前我写的文章<ajax 设置Access-Control-Allow-Origin实现跨域访问> 1.ajax跨域访问,cookie丢失 首先创建两个测试域名 a.fdipzone.com 作为客户端域名 b.fdipzone.com 作为服务端域名 测试代码 setcookie.PHP 用于设置服务端co

  • Java中Json字符串直接转换为对象的方法(包括多层List集合)

    使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-beanutils.jar,commons-httpclient.jar,commons-lang.jar,ezmorph.jar,morph-1.0.1.jar 下面是例子代码: // JSON转换 JSONObject jsonObj = JSONObject.fromObject(jsonStr

  • vue中axios解决跨域问题和拦截器的使用方法

    vue中axios不支持vue.use()方式声明使用. 所以有两种方法可以解决这点: 第一种: 在main.js中引入axios,然后将其设置为vue原型链上的属性,这样在组件中就可以直接 this.axios使用了 import axios from 'axios'; Vue.prototype.axios=axios; components: this.axios({ url:"a.xxx", method:'post', data:{ id:3, name:'jack' } }

  • 关于python的bottle框架跨域请求报错问题的处理方法

    在用python的bottle框架开发时,前端使用ajax跨域访问时,js代码老是进入不了success,而是进入了error,而返回的状态却是200.url直接在浏览器访问也是正常的,浏览器按F12后会发现下面这个错误提示 XMLHttpRequest cannot load http://192.168.0.118:8081/get_mobile_number/?id=1. No 'Access-Control-Allow-Origin' header is present on the r

  • 利用java反射机制实现自动调用类的简单方法

    1. 新建TestServlet类 package com.yanek.test; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.ht

随机推荐