0 0

关于人人网的json数据的问题3

前几天看了http://www.iteye.com/topic/826988关于抓取人人网的数据的问题,但是看到http://s.xnimg.cn/a13819/allunivlist.js这个js文件上的json数据,小弟想请问一下,这样的json数据时怎么样生成的,貌似俺以前做json数据生成的时候,如果有Collection类型的数据就会报错,希望了解这样的问题的童鞋给点提示,或者是直接上代码,谢谢......如果用json-lib,代码要怎么样写?

问题补充:
zhanjia 写道
json-lib使用例子:
package json.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

public class FirstTest {

	/**
	 * 简化System.out.println
	 * 
	 * @param obj
	 */
	public static void out(Object obj) {
		System.out.println(obj);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// boolean数组
		boolean[] boolArray = new boolean[] { true, false, true };
		JSONArray jsonArray = JSONArray.fromObject(boolArray);
		out(boolArray + "结果:" + jsonArray);

		// List
		List<String> list = new ArrayList<String>();
		list.add("first");
		list.add("second");
		JSONArray jsonArray1 = JSONArray.fromObject(list);
		out(list + "结果:" + jsonArray1);

		// String[]
		JSONArray jsonArray2 = JSONArray.fromObject("['json','is','easy']");
		out(jsonArray2);

		// Map
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("name", "json");
		map.put("bool", Boolean.TRUE);
		map.put("int", new Integer(1));
		map.put("arr", new String[] { "a", "b" });
		map.put("func", "function(i){ return this.arr[i]; }");
		JSONObject jsonObject = JSONObject.fromObject(map);
		out(jsonObject);

		// Bean
		JSONObject jsonObject1 = JSONObject.fromObject(new MyBean());
		out("Bean:" + jsonObject1);
	}

}



package json.bean;

import net.sf.json.JSONFunction;

public class MyBean {
	private String name = "json";

	private int pojoId = 1;

	private char[] options = new char[] { 'a', 'f' };

	private String func1 = "function(i){ return this.options[i]; }";

	private JSONFunction func2 = new JSONFunction(new String[] { "i" }, "return this.options[i];");

	public String getFunc1() {
		return func1;
	}

	public void setFunc1(String func1) {
		this.func1 = func1;
	}

	public JSONFunction getFunc2() {
		return func2;
	}

	public void setFunc2(JSONFunction func2) {
		this.func2 = func2;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public char[] getOptions() {
		return options;
	}

	public void setOptions(char[] options) {
		this.options = options;
	}

	public int getPojoId() {
		return pojoId;
	}

	public void setPojoId(int pojoId) {
		this.pojoId = pojoId;
	}

}

我仿照人人网上面建立了三个类Province  College  Depart
这三个实体的关系是
Province-----College一对多,双向
College------Depart一对多,双向,但是我测试代码如下:
@Test
	public void testFormat() {
		Province pro = new Province();
		pro.setProid(12);
		pro.setProname("湖北省");
		College col1 = new College();
		col1.setColid(122);
		col1.setName("黄冈师范");
		College col2 = new College();
		col2.setColid(123);
		col2.setName("黄冈师范学院");
		Department dept1 = new Department();
		dept1.setDepid(1224);
		dept1.setDepname("计科院");
		Department dept2 = new Department();
		dept2.setDepid(1225);
		dept2.setDepname("计科");
		Set<Department> depts = new HashSet<Department>();
		depts.add(dept1);
		depts.add(dept2);
		col1.setDepts(depts);
		col2.setDepts(depts);
		Set<College> cols = new HashSet<College>();
		cols.add(col1);
		cols.add(col2);
		pro.setColleges(cols);
		JSONObject json = JSONObject.fromObject(pro);
		System.out.println(json.toString());
	}


最后打印出来的数据是:
{"colleges":[{"colid":123,"depts":[{"college":null,"depid":1225,"depname":"计科"},{"college":null,"depid":1224,"depname":"计科院"}],"name":"师范学院","province":null},{"colid":122,"depts":[{"college":null,"depid":1225,"depname":"计科"},{"college":null,"depid":1224,"depname":"计科院"}],"name":"师范","province":null}],"proname":"湖北省","proid":12}
如果在College中设置了Province属性,或是在Depart中设置了College属性,就会报错,在上面的测试代码中就没有设置,但是转换出来的json数据中有null属性,请问在json-lib中有没有方法将这样的属性去掉,由于转换的是Province这个类,这些为null的属性都是在College或Depart类中,如果不用字符串的替换该怎么做?谢谢.....
2011年1月02日 11:50

5个答案 按时间排序 按投票排序

0 0

采纳的答案

如果在College中设置了Province属性,或是在Depart中设置了College属性,就会报错


这是由于在生成json字符串时,由于College包含了Province,Province又包含了College,造成了循环引用


解决方法:
在上面的过滤器配置JsonConfig中添加:
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);

2011年1月02日 20:33
0 0

过滤为值为null的属性,代码如下:

import net.sf.json.util.PropertyFilter;

/**
 * 自定义属性过滤器
 * 
 * @author qiuzj
 *
 */
public class CustomPropertyFilter implements PropertyFilter {

	@Override
	public boolean apply(Object source, String name, Object value) {
		// 过滤掉为null的属性
		if (value == null)
			return true;
		return false;
	}

}



import java.util.HashSet;
import java.util.Set;

import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

public class Test1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Test1 test = new Test1();
		test.testFormat();
	}

	public void testFormat() {
		Province pro = new Province();
		pro.setProid(12);
		pro.setProname("湖北省");
		College col1 = new College();
		col1.setColid(122);
		col1.setName("黄冈师范");
		College col2 = new College();
		col2.setColid(123);
		col2.setName("黄冈师范学院");
		Department dept1 = new Department();
		dept1.setDepid(1224);
		dept1.setDepname("计科院");
		Department dept2 = new Department();
		dept2.setDepid(1225);
		dept2.setDepname("计科");
		Set<Department> depts = new HashSet<Department>();
		depts.add(dept1);
		depts.add(dept2);
		col1.setDepts(depts);
		col2.setDepts(depts);
		Set<College> cols = new HashSet<College>();
		cols.add(col1);
		cols.add(col2);
		pro.setColleges(cols);

		// 自定义过滤器
		JsonConfig config = new JsonConfig();
		config.setJsonPropertyFilter(new CustomPropertyFilter());
		
		JSONObject json = JSONObject.fromObject(pro, config);

		System.out.println(json.toString());
	}

}

2011年1月02日 20:23
0 0

net.sf.json.util.PropertyFilter可以实现对属性的过滤:
可以参考:
http://wujuncheng.iteye.com/blog/543763

2011年1月02日 20:03
0 0

这个不难,在json-lib 中有几种对象 JSONObject JSONArray这两个最关键,一种是转换为json对象,一种是json数组,既:
1。[{"a":"1","b":"2"},{"a":"2","b":"3"}]
2. {"a":"1","b":"2"}

如果你想collection到json转换,首先你的collection结构要与json对应上
{...}这样是一个对象,在js中。但是它同样在java中等同一个对象,所以你要建立一个java对象来符合他,拿{"a":"1","b":"2"}来说,你得先建立一个java对象

public class A{
 private string a;
 private string b;
 ...
}
//这里注意只有有getter setter方法的属性才可以转换为json中的属性



A abc = new A("1","2");
JSONObject obj = JSONObject.fromObject(abc);
//obj = {"a":"1","b":"2"}


如果你要一个层级的比如:
{"a":1,obj:{"b":3}};
那么对象得这么建
public class A{
private int a;
private C obj; //这里的名称跟json生成的格式中的属性名称是一样的
...
}
class C{
private int b;
...
}

C c = new C(3);
A a = new A(1,c);
JSONObject obj = JSONObject.fromObject(A);
//结果:{"a":1,obj:{"b":3}};



这里说说
[{"a":"1","b":"2"},{"a":"2","b":"3"}]

这是JSONArray格式,可以通过:
List<A> list = new ArrayList<A>();
...

JSONArray arry = JSONArray.fromObject(list);

2011年1月02日 12:21
0 0

json-lib使用例子:

package json.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

public class FirstTest {

	/**
	 * 简化System.out.println
	 * 
	 * @param obj
	 */
	public static void out(Object obj) {
		System.out.println(obj);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// boolean数组
		boolean[] boolArray = new boolean[] { true, false, true };
		JSONArray jsonArray = JSONArray.fromObject(boolArray);
		out(boolArray + "结果:" + jsonArray);

		// List
		List<String> list = new ArrayList<String>();
		list.add("first");
		list.add("second");
		JSONArray jsonArray1 = JSONArray.fromObject(list);
		out(list + "结果:" + jsonArray1);

		// String[]
		JSONArray jsonArray2 = JSONArray.fromObject("['json','is','easy']");
		out(jsonArray2);

		// Map
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("name", "json");
		map.put("bool", Boolean.TRUE);
		map.put("int", new Integer(1));
		map.put("arr", new String[] { "a", "b" });
		map.put("func", "function(i){ return this.arr[i]; }");
		JSONObject jsonObject = JSONObject.fromObject(map);
		out(jsonObject);

		// Bean
		JSONObject jsonObject1 = JSONObject.fromObject(new MyBean());
		out("Bean:" + jsonObject1);
	}

}



package json.bean;

import net.sf.json.JSONFunction;

public class MyBean {
	private String name = "json";

	private int pojoId = 1;

	private char[] options = new char[] { 'a', 'f' };

	private String func1 = "function(i){ return this.options[i]; }";

	private JSONFunction func2 = new JSONFunction(new String[] { "i" }, "return this.options[i];");

	public String getFunc1() {
		return func1;
	}

	public void setFunc1(String func1) {
		this.func1 = func1;
	}

	public JSONFunction getFunc2() {
		return func2;
	}

	public void setFunc2(JSONFunction func2) {
		this.func2 = func2;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public char[] getOptions() {
		return options;
	}

	public void setOptions(char[] options) {
		this.options = options;
	}

	public int getPojoId() {
		return pojoId;
	}

	public void setPojoId(int pojoId) {
		this.pojoId = pojoId;
	}

}

2011年1月02日 12:15

相关推荐

    人人网高校信息库(json格式)

    我们既可以使用HttpClient来爬取这个js里的内容,通过jsoup等解析html,也可以使用正则表达式来获取json数据。非常方便,可以将获取的数据存入我们自己的数据库,构建我们自己的本地高校信息库,非常方便。

    获取全国中学信息(人人网)

    标题 "获取全国中学信息(人人网)" 暗示我们关注的是一个涉及数据抓取或网络爬虫的项目,具体是从人人网这个社交平台上抓取全国中学的相关信息。这通常涉及到编程语言如Python,可能使用了requests库来发送HTTP请求...

    中国所有大学数据(json格式的js文件)

    一共包含了全国3049所大学, 从人人网拷贝的 (仅供学习交流, 请勿用于商业项目)

    获取世界大学数据(人人网)

    标题“获取世界大学数据(人人网)”指向的是一个与数据采集相关的项目,可能是通过编程方式从人人网这个社交平台获取关于全球大学的信息。在这个过程中,开发者可能利用了网络爬虫技术来抓取并整理这些数据。源码...

    人人网接口文件.NET

    库中的数据处理模块负责将从人人网服务器返回的JSON或XML格式数据转换为.NET对象,方便开发者进行操作和存储。同时,它还可能包含序列化和反序列化的功能,使得开发者可以将.NET对象转化为适合发送给人人网服务器的...

    项目中读取人人网数据出入数据

    标题中的“项目中读取人人网数据出入数据”暗示了我们将在一个项目环境中处理与人人网(Renren)相关的数据输入和输出。这通常涉及到网络爬虫、数据分析或社交网络研究。人人网是中国的一个社交平台,它提供了丰富的...

    人人网.NET API

    人人网.NET API是一个专为开发者设计的平台,用于与人人网进行交互,通过编程的方式实现对用户信息的获取、发布动态、管理应用等操作。这个API是基于.NET框架构建的,使得.NET开发者能够轻松地集成人人网的功能到...

    利用人人网去获取世界各地的大学信息

    标题“利用人人网去获取世界各地的大学信息”指的是通过编程技术,从人人网这个社交平台中抓取并分析关于全球各地大学的相关数据。这通常涉及到网络爬虫技术,特别是Python语言中的Scrapy或BeautifulSoup库,用于...

    VB版人人网SDK_v2

    4. **数据格式**:人人网API通常返回JSON格式的数据,开发者需要使用VB的JSON解析库将数据转换为对象,便于操作和显示。 5. **异步编程**:为了提高用户体验,可以使用VB的异步编程模型来调用API,避免阻塞UI线程。...

    人人网登录

    - HTTP 请求和响应:与人人网API交互需要发送HTTP请求,例如GET和POST,可能涉及JSON格式的数据交换。 - 安全性:确保用户数据的安全,如正确存储和处理访问令牌,避免中间人攻击。 - 错误处理:处理可能出现的网络...

    人人网信息备份工具

    【标题】"人人网信息备份工具"涉及到的主要知识点是利用编程语言进行数据抓取和备份,特别是使用Python作为开发工具。人人网是一个社交网络平台,用户可以在这里分享信息、交流互动。随着时间的推移,这些数据可能变...

    人人网项目网站

    【人人网项目网站】是一个基于社交网络平台的项目,它主要围绕着“人人”这一核心概念,旨在构建一个用户可以互动、分享信息和资源的在线社区。在这个项目中,"Member"可能指的是用户模块,是整个网站的核心组成部分...

    c# 人人网API SDK(2011-05-17)

    在C#环境中,开发者需要了解.NET Framework或.NET Core的使用,以及XMLHttpRequest或HttpClient类进行HTTP请求,理解JSON或XML数据解析,以便与人人网API进行数据交互。此外,对于OAuth认证机制的理解也是必不可少的...

    人人网客户端

    人人网客户端是一款基于第三方API构建的应用程序,它...以上就是关于人人网客户端开发的主要知识点,涵盖了从API接口到客户端应用的全生命周期。每个环节都需要开发者深入理解和熟练掌握,以打造一款高质量的社交应用。

    安卓人人网客户端功能图全

    3. **JSON解析**:查看如何解析和处理来自人人网API的JSON数据,展示在UI上。 4. **UI设计**:学习安卓布局设计,如LinearLayout、RelativeLayout、ConstraintLayout等,以及自定义View的使用。 5. **数据库操作**...

    人人网API .NET 示例

    开发者可以在此找到具体的接口调用示例,学习如何初始化API客户端,如何构造参数,以及如何解析返回的JSON数据。 为了更好地理解和使用这个示例,建议先熟悉.NET框架和C#语言,以及OAuth 2.0授权协议。同时,阅读...

    [安卓开源]高仿人人网客户端

    开发者可能会使用到像OkHttp这样的网络库来发送HTTP请求,获取人人网API的数据,然后使用Gson或Jackson等库将JSON数据解析成Java对象。理解如何处理网络异步操作,以及如何在Android应用中正确地使用异步任务...

    android系统手机人人网备份源码

    3. **JSON解析**:人人网的数据可能是JSON格式,因此项目可能使用了Gson、Jackson或org.json等库进行数据解析。 4. **Android权限管理**:由于涉及网络访问和个人数据备份,需要处理Android的权限声明,如INTERNET...

    DISCUZ NT整合人人网登录详解及其整合完整程序

    2. **JSON数据处理**:人人网API返回的数据通常是JSON格式,需要了解如何在.NET环境中解析和使用JSON数据。 3. **跨域请求**:由于浏览器的安全策略,可能需要处理跨域请求,如使用JSONP或CORS。 **安全考虑** 1. ...

Global site tag (gtag.js) - Google Analytics