`
ahuango
  • 浏览: 56776 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个简单的JSON 数据格式转换类

阅读更多
在项目中使用JSON格式传输数据时经常碰到数据格式的转换, 一般可以使用Json.org的lib, 以及一些第三方的框架来完成。 但是如果只是一个简单的项目,而且json的使用并不多的情况下,可以自己写一个类来处理。
在代码中,我让我的Json类继承与TreeMap,这样可以利用Map与Json格式的相似性,节省一些代码量和定义数据结构的烦恼。 Json结构在前台支持基本数据类型和数据类型, 所以这样的数据类型在js中也是有效的:
{'1':'ha','2':'ch','3':['list1','list2','list3']}

依据这个格式,这个类只处理不同json格式和含有数组的数据类型的转换。代码如下,
public class Json extends TreeMap<String, Object> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	

	public void add(String key, Object value) {
		if (value instanceof String) {
			value = JsonUtil.encode((String) value);
		}
		this.put(JsonUtil.encode(key), value);
	}

	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("{");
		boolean first = true;
		for (Iterator<Map.Entry<String, Object>> it = this.entrySet().iterator(); it.hasNext();) {
			Map.Entry<String, Object> me = it.next();
			Object temp = me.getValue();
			if (!first)
				sb.append(",");
			else
				first = false;
			sb.append("'" + me.getKey() + "':");
			if (temp instanceof String || temp.getClass().isPrimitive()
					|| temp.getClass().getName().startsWith("java.lang")) {
				sb.append("'" + temp + "'");
			} else if (temp instanceof Json) {
				sb.append(((Json) temp).toString());
			} else {
				sb.append(temp.toString());
			}
		}
		sb.append("}");
		return sb.toString();
	}

	public String getStringValue(String key) {
		return (String) this.get(key);
	}

	public int getIntValue(String key) {
		String str = getStringValue(key);
		if (str != null)
			str = str.trim();
		return new Integer(str).intValue();
	}

	public String firstKeyString() {
		if (this == null || this.size() == 0)
			throw new RuntimeException("The json map doesn't have any contents!");
		return (String) this.keySet().iterator().next();
	}

	public Date getSqlDate(String key) {
		String dateStr = getStringValue(key);
		try {
			return java.sql.Date.valueOf(dateStr);
		} catch (IllegalArgumentException e) {

		}
		return null;
	}
}

另外有一个Util类来处理一些数据转换, 这个类相当于一个Factory, 也可以用你过来从String parse 一个Json Java对象,
public class JsonUtil {
	public static Json parse(String json) {
		Json js = new Json();
		if (json == null || json.trim().length() == 0 || json.trim().length() == 2)
			return js;
		json = json.substring(1, json.length() - 1);
		char[] chars = json.toCharArray();
		for (int i = 0, n = chars.length; i < n;) {
			StringBuffer sbKey = new StringBuffer();
			while (chars[i] != ':' && i < n) {
				if (chars[i] != '\'')
					sbKey.append(chars[i]);
				i++;
			}
			if (chars[i] == ':') {
				StringBuffer sb = new StringBuffer();
				int j = i + 1;
				if (j < n && chars[j] == '{') {
					int count = 0;
					// j++;
					while (j < n && (chars[j] != '}' || count > 1)) {
						if (chars[j] == '{')
							count++;
						if (chars[j] == '}')
							count--;
						sb.append(chars[j]);
						j++;
					}
					if (j == n)
						return new Json();
					sb.append(chars[j]);
					js.add(sbKey.toString(), parse(sb.toString()));
					i = j + 1;
					while (i < n && chars[i] == ',')
						i++;
				} else if (j < n && chars[j] == '[') {
					int count = 0;
					while (j < n && (chars[j] != ']' || count > 1)) {
						if (chars[j] == '[')
							count++;
						if (chars[j] == ']')
							count--;
						sb.append(chars[j]);
						j++;
					}
					if (j == n)
						return new Json();
					sb.append(chars[j]);
					js.add(sbKey.toString(), buildList(sb.toString()));
					i = j + 1;
					while (i < n && chars[i] == ',')
						i++;
				} else if (j < n) {
					while (j < n) {
						if (chars[j] != '\'')
							sb.append(chars[j]);
						if (j < n - 1 && chars[j + 1] == ',') {
							js.add(sbKey.toString(), sb.toString());
							i = j + 2;
							break;
						} else if (j == n - 1) {
							js.add(sbKey.toString(), sb.toString());
							i = j + 1;
							break;
						}
						j++;
					}
				} else {
					js.add(sbKey.toString(), "");
					i = n;
				}
			}
		}
		return js;
	}
	
	public static List<String> buildList(String value) {
		List<String> result = new ArrayList<String>();
		if (value == null || value.trim().length() <= 2)
			return result;
		value = value.substring(1, value.length() - 1);
		String[] members = value.split(",");
		for (int i = 0, n = members.length; i < n; i++) {
			String temp = members[i];
			if (temp.startsWith("'"))
				result.add(encode(temp.substring(1, temp.length() - 1)));
			else
				result.add(encode(temp));
		}
		return result;
	}
	
	public static String encode(String value) {
		if (value == null)
			return "";
		char content[] = new char[value.length()];
		value.getChars(0, value.length(), content, 0);
		StringBuffer result = new StringBuffer(content.length + 50);
		for (int i = 0; i < content.length; i++) {
			switch (content[i]) {
			case '\'':
				result.append("\\x27");
				break;
			case '\n':
				result.append("\\x0A");
				break;
			case '\r':
				result.append("\\x0D");
				break;
			default:
				result.append(content[i]);
			}
		}
		return result.toString();
	}
	
	public static void main(String[] args) {
		String js = "{'1':'ha','2':'ch','3':['lis't1','lis\nt2','lis\n\rt3']}";
		Json json = JsonUtil.parse(js);
		System.out.println(json);
	}


这里处理了会对前台js识别Json数组有影响的字符, 包括['|\n|\r],这三个。 处理方法是用这些字符的ASCII码来代替,这样js不会把它当作特殊的字符处理比如回车符,而只有在这些字符显示出来的时候才会产生作用。
分享到:
评论

相关推荐

    C#的json数据格式转化

    描述:C#的JSON数据转换,转换对象为JSON格式数据 标签:C#、JSON JSON数据格式转换的重要性 在C#语言中,JSON数据格式转换是非常重要的,因为它可以将对象转换为JSON格式的数据,从而实现数据的交换和存储。JSON...

    json数据格式转换

    下面通过一个具体的示例来展示如何使用 Android 2.3 提供的 JSON 解析类来构建一个 JSON 文本: ```java // 假设现在要创建这样一个 JSON 文本 // { // "phone": ["12345678", "87654321"], // 数组 // "name": ...

    json格式与java类对象相互转换

    1. 首先,我们需要一个Java类来映射JSON数据。例如,我们有一个User类,包含id、name和email字段: ```java public class User { private int id; private String name; private String email; // 构造函数、...

    把JSON数据格式转换为Python的类对象方法详解(两种方法)

    为了将JSON数据转换为自定义的Python类的对象,我们可以利用`object_hook`参数指定一个函数,该函数接受一个字典并将其转换为我们所需的类的实例。 ##### 实现步骤 1. **定义类**:首先,需要定义一个Python类,该...

    Json.net Json数据转换的利器

    在标题"Json.net Json数据转换的利器"中,"Json数据转换"是指Json.NET的主要功能,即处理JSON格式的数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...

    VB利用官方api读写JSON数据格式文件简单实例

    在VB(Visual Basic)编程环境中,使用官方API来读写JSON数据格式文件是常见的操作,尤其是在处理网络数据交换或者存储配置信息时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和...

    JAVA-JSON工具转换类

    `JsonUtil.java`看起来是一个自定义的工具类,很可能包含了对`json-lib`和`ezmorph`的封装,提供了简洁易用的API供开发者进行JSON操作。可能包含的方法有`toJson()`(将Java对象转换为JSON字符串)、`fromJson()`...

    json格式数据转换

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。它基于JavaScript的一...在实际项目中,根据需求灵活运用这两个方法,能够解决大部分与JSON数据转换相关的问题。

    将VOC格式的数据集转换为COCO格式,xml格式转换成json格式

    将VOC格式的数据集转换为COCO格式,xml格式转换成json格式 effcientdet等网络中均可用到

    json万能转换类

    例如,你可以使用`JsonConvert.SerializeObject()`方法将一个C#对象序列化成JSON,然后使用`JsonConvert.DeserializeObject()`方法将JSON字符串反序列化回相应的对象类型。 2. **动态JSON**:库提供`JObject`,`...

    json一键转换为易语言自定义数据类型1

    【描述】:本文档将详细介绍如何将 JSON 数据转换成易语言的自定义数据类型,并提供了一个示例软件供参考。通过这个方法,可以自动化地将 JSON 对象映射到易语言的数据结构中,避免手动创建复杂数据结构的繁琐工作。...

    json字符串转换c++类对象

    在C++编程中,将JSON字符串转换为C++类对象是一项常见的任务,特别是在处理网络通信、数据存储或配置文件时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析...

    Json格式转换类.zip

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间的数据传输。...通过理解这些转换方法,开发者可以轻松地在C#应用程序中与其他系统进行JSON数据交换,提升开发效率。

    jsonview,转换json格式

    在实际使用中,这可能包括将大型的、未格式化的JSON字符串转化为可读的树状视图,或者将JSON数据转换成其他格式,如CSV或XML,以便进一步处理。 **文件名称列表:JsonView** 这表明压缩包内可能包含JSONView的安装...

    excel数据转json格式数据

    在IT领域,数据转换是一项常见的任务,...总之,将Excel数据转换为JSON格式是一个实用的过程,尤其在需要与Web应用交互或进行数据分析时。通过理解这两种格式的特点和转换方法,你可以更有效地管理和利用你的数据资源。

    java-任何类型转换成json数据格式

    在所提供的代码片段中,定义了一个名为`Json`的类,该类包含了一些静态方法用于将不同的Java数据类型转换为JSON格式的字符串。这些方法包括: - `object2json(Object obj)`:这是主方法,用于处理任意类型的Java...

    格式转换工具json2bin

    "json2bin"是一个专门用于将JSON数据转换为二进制格式的工具。它能够将JSON对象转换成更紧凑的二进制表示,从而节省存储空间和提高处理速度。在软件开发过程中,这样的工具非常有用,尤其是在处理大量结构化数据时。...

    将各种数据转换JSON格式

    标题中的“将各种数据转换JSON格式”指的是将不同来源或结构的数据,如表格(CSV、Excel)、数据库记录、XML文档等,转换为JSON对象,以便于数据处理、存储或网络传输。这涉及到数据解析、格式转换和编码等多个技术...

    Unity3D中任意类型数据转换成json数据的方法2

    本文将深入探讨如何在Unity3D中将任意类型的数据转换成JSON格式。 首先,我们需要了解JSON的基本结构。JSON是一种基于文本的数据格式,主要由键值对组成,可以表示数组和对象。对象以大括号 `{}` 包裹,键值对以...

Global site tag (gtag.js) - Google Analytics