五、Json

1.Json概念:特殊的字符串

  JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级

  数据交换格式。

  XML也是一种数据交换格式,为什么没有选择XML呢?

  因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,

  增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据。

  

2.对象和Json之间的转换

      <1>对象--->字符串:  JsonObject jsonObject=JsonObject.fromObject(对象);
      <2>字符串-->对象:  
            ①.JsonObject jsonObject=JsonObject.fromObject(字符串);
            ②.对象=jsonObject.toBean(jsonObject,对象.class);

3.对象集合和字符串之间的转换

     <1>对象集合--->字符串
            JsonArray jsonArray=JsonArray.fromObject(对象集合);
     <2>字符串---->对象集合
            JsonArray jsonArray=JsonArray.fromObject(字符串);
            对象集合=jsonArray.toCollection(jsonArray);

4.在JSP中使用Json

      在jsp页面引入json.js文件
     <1>Json.stringify(对象)----->将JS对象转换成Json字符串
     <2>Json.parse-------->将Json字符串转成Js对象

      http://www.bejson.com/  校验Json格式



例子

package com.zking.entity;

public class Person {
       private int pid;
       private String pname;
       private int page;
       
       public Person() {
    	   super();
    	   // TODO Auto-generated constructor stub
       }
       public Person(int pid, String pname, int page) {
    	   super();
    	   this.pid = pid;
    	   this.pname = pname;
    	   this.page = page;
       }
       
		public int getPid() {
			return pid;
		}
		public void setPid(int pid) {
			this.pid = pid;
		}
		public String getPname() {
			return pname;
		}
		public void setPname(String pname) {
			this.pname = pname;
		}
		public int getPage() {
			return page;
		}
		public void setPage(int page) {
			this.page = page;
		}
		
		@Override
		public String toString() {
			return "Person [page=" + page + ", pid=" + pid + ", pname=" + pname
					+ "]";
		}
       
       
}

package com.zking.test;

import java.util.ArrayList;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.junit.Test;

import com.zking.entity.Person;

/**
 * {} Json对象          JsonObject
 * [] Json对象集合   JsonArray
 *
 */
public class TestJson {

//对象和Json之间的转换
	   /**
	    * 对象转成Json(常用)
	    * <1>对象--->字符串:  JsonObject jsonObject=JsonObject.fromObject(对象);
	    */
	    @Test
	    public void testObjectToJson(){
	    	   Person per=new Person(1,"admin",20);
	    	   JSONObject jb=JSONObject.fromObject(per);
	    	   System.out.println(jb.toString());//控制台输出: {"page":20,"pid":1,"pname":"admin"}
	    }
	
	    /**
	     * json字符串转成对象
	     * <2>字符串-->对象:  
	     *     ①.JsonObject jsonObject=JsonObject.fromObject(字符串);
	     *     ②.对象=jsonObject.toBean(jsonObject,对象.class);
	     */
	     @Test
	     public void testJsonToObject(){
	    	    Person per=new Person(1,"admin",20);
	    	    JSONObject jb=JSONObject.fromObject(per);
	    	    String str=jb.toString();
	    	    
	    	    Person per2=(Person)JSONObject.toBean(jb,Person.class);
	    	    System.out.println(per2);//控制台输出:  Person [page=20, pid=1, pname=admin]
	     }
	    
	     
//对象集合和字符串之间的转换	    
	     /**
	      * 对象集合转成Json(常用)
	      * <1>对象集合--->字符串
	      *    JsonArray jsonArray=JsonArray.fromObject(对象集合);
	      */
	      @Test
	      public void testArrayToJson(){
	    	     List<Person> lt=new ArrayList<Person>();
	    	     for (int i = 1; i <= 36; i++) {
					  lt.add(new Person(i,"G160628S"+i,19));
				 }
	    	     JSONArray ja=JSONArray.fromObject(lt);
	    	     System.out.println(ja.toString());
	      }
	     
	     /**
	      * 将Json转成对象集合
	      * <2>字符串---->对象集合
	      *    JsonArray jsonArray=JsonArray.fromObject(字符串);
	      *    对象集合=jsonArray.toCollection(jsonArray);
	      */
	      public void testJsonToArray(){
	    	     List<Person> lt=new ArrayList<Person>();
	    	     for (int i = 0; i <= 36; i++) {
					  lt.add(new Person(i,"G160628S"+i,19));
				 }
	    	     JSONArray ja=JSONArray.fromObject(lt);
	    	     
	    	     List<Person> lt2=(List<Person>) JSONArray.toCollection(ja,Person.class);
	    	     for (Person p : lt2) {
					  System.out.println(p);
				}
	      }
	
} 


index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	
	
	<script type="text/javascript" src="jQuery/jquery-3.1.1.min.js"></script>
	<script type="text/javascript">
	        function Person(pid,pname,page){
	        	     this.pid=pid;
	        	     this.pname=pname;
	        	     this.page=page;
	        }
	        $(function(){
	        	  $("#jsonToObject").click(function(){
	        		    //把json转成对象(最常用)
	        		    var per=new Person(1,"admin",23);
	        		    var str=JSON.stringify(per);
	        		    var perVar=JSON.parse(str);
	        		    alert(perVar.pname);
	        	  });
	        	  
	        	  $("#ObjectToJson").click(function(){
	        		    var per=new Person(1,"admin",21);
	        		    //将对象转成Json(不常用)
	        		    var str=JSON.stringify(per);
	        		    alert(str);
	        	  });
	        });
	</script>
	
  </head>
  
  <body>
       <input type="button" value="Json转成对象" id="jsonToObject"/>
       <input type="button" value="对象转成Json" id="ObjectToJson"/>
  </body>
  
  <%-- 浏览器查看:    http://localhost:8080/web05_Json/index.jsp --%>
  
  
  
</html>


要记得导包哦




如有错误的地方,还请大家帮忙指出来。




### 如何使用 SQL 查询关联JSON 文件中的数据 在现代数据处理中,JSON 文件因其灵活性和可读性被广泛应用于数据存储和交换。要将多个 JSON 文件中的数据通过 SQL 进行关联查询,可以采用以下方法:首先将 JSON 数据加载到数据库中(例如 MySQL、PostgreSQL 等支持 JSON 类型的数据库),然后利用 SQL 语句对这些数据进行操作[^1]。 #### 1. 加载 JSON 数据到数据库 在开始查询之前,需要确保 JSON 文件的数据已经被正确加载到数据库中。常见的做法是将每个 JSON 文件的内容导入为一个表,或者将所有文件合并为一个表并添加标识字段以区分来源。以下是两种常见方式: - **方式一:每个 JSON 文件对应一个表** 每个 JSON 文件的数据被加载到单独的表中,表结构可以通过解析 JSON 的键值对生成。例如,在 PostgreSQL 中,可以使用 `jsonb` 类型来存储 JSON 数据[^2]。 - **方式二:合并到一个表中** 如果 JSON 文件具有相同的结构,可以将它们合并到一个表中,并添加一个额外的字段(如文件名或 ID)以区分不同文件的来源。 ```sql CREATE TABLE json_data ( file_id SERIAL PRIMARY KEY, source_file TEXT, -- 标识 JSON 文件来源 data JSONB -- 存储 JSON 数据 ); ``` #### 2. 解析 JSON 数据 一旦 JSON 数据被加载到数据库中,可以使用 SQL 提供的函数来解析 JSON 数据。例如,在 PostgreSQL 中,可以使用以下函数解析 JSON 数据[^1]: - `->`:提取 JSON 对象中的键值。 - `->>`:提取 JSON 对象中的键值并将其作为文本返回。 - `jsonb_array_elements()`:将 JSON 数组展开为多行。 假设我们有JSON 文件,分别命名为 `file1.json`, `file2.json`, ..., `file5.json`,并且已经加载到一个名为 `json_data` 的表中,其中 `data` 列存储了 JSON 数据。 #### 3. 关联查询 为了实现关联查询,需要明确各个 JSON 文件之间的关系。例如,假设 `file1.json` 和 `file2.json` 具有一个共同的键 `id`,可以使用 SQL 的 `JOIN` 语句将它们关联起来。 以下是一个示例查询,展示如何将JSON 文件中的数据进行关联: ```sql SELECT t1.data->>'id' AS id, t1.data->>'name' AS name, t2.data->>'value' AS value, t3.data->>'status' AS status, t4.data->>'date' AS date, t5.data->>'category' AS category FROM json_data t1 JOIN json_data t2 ON (t1.data->>'id')::TEXT = (t2.data->>'id')::TEXT JOIN json_data t3 ON (t1.data->>'id')::TEXT = (t3.data->>'id')::TEXT JOIN json_data t4 ON (t1.data->>'id')::TEXT = (t4.data->>'id')::TEXT JOIN json_data t5 ON (t1.data->>'id')::TEXT = (t5.data->>'id')::TEXT WHERE t1.source_file = 'file1.json' AND t2.source_file = 'file2.json' AND t3.source_file = 'file3.json' AND t4.source_file = 'file4.json' AND t5.source_file = 'file5.json'; ``` 上述查询中,`t1`, `t2`, ..., `t5` 分别代表从JSON 文件中加载的数据表。通过 `ON` 子句指定关联条件,即 `id` 字段相等。同时,`source_file` 字段用于区分不同的 JSON 文件[^2]。 #### 4. 错误处理与注意事项 在实际操作中,可能会遇到以下问题: - **数据格式不一致**:确保所有 JSON 文件的结构相同或兼容。如果存在差异,可能需要进行数据转换[^4]。 - **性能优化**:对于大规模数据集,建议索引常用的 JSON 键(如 `id`)以提高查询效率。 - **空值处理**:某些 JSON 文件可能缺少特定字段,需要在查询中处理空值。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值