java怎样将json转化为java 字符串转化json格式化

一.Json对象与Json字符串的转化
1.jQuery插件支持的转换方式:
  $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象
2.浏览器支持的转换方式(Firefox,chrome,opera,safari,ie9,ie8)等浏览器:
  JSON.stringify(obj)将JSON转为字符串。JSON.parse(string)将字符串转为JSON格式;
var a={"name":"tom","sex":"男","age":"24"}; var b='{"name":"Mike","sex":"女","age":"29"}'; var aToStr=JSON.stringify(a); var bToObj=JSON.parse(b); alert(typeof(aToStr));& //string alert(typeof(bToObj));//object
3.Javascript支持的转换方式:
eval('(' + jsonstr + ')'); //可以将json字符串转换成json对象,注意需要在json字符外包裹一对小括号
注:ie8(兼容模式),ie7和ie6也可以使用eval()将字符串转为JSON对象,但不推荐这些方式,这种方式不安全eval会执行json串中的表达式。
4.JSON官方的转换方式:
http://www.json.org/提供了一个json.js,这样ie8(兼容模式),ie7和ie6就可以支持JSON对象以及其stringify()和parse()方法;
可以在/douglascrockford/JSON-js上获取到这个js,一般现在用json2.js。
二、JSON&字符串&与&java&对象的转换
1. 把java 对象列表转换为json对象数组,并转为字符串
&&&&JSONArray array = JSONArray.fromObject(list);
&&&&String
jsonstr = array.toString();
2. 把java对象转换成json对象,并转化为字符串
&&JSONObject object =
JSONObject.fromObject(user);
&&Log4jInit.ysulogger.debug(object.toString());
3.把JSON字符串转换为JAVA
&&JSONArray json =
JSONArray.fromObject(userStr);//userStr是json字符串
&&List&User&
(List&User&)JSONArray.toCollection(json, User.class);
4.把JSON字符串转换为JAVA
  JSONObject
jsonobject = JSONObject.fromObject(jsonStr);  User user=
(User)JSONObject.toBean(object,User.class);
阅读(...) 评论()博客分类:
json-lib是java开发中比较常用的java bean和json相互转换的工具, 它可配置化的解析过程使用起来非常灵活。但官方文档比较简单,新手使用稍有困难。
本文将简单介绍java bean转化为json的使用方式、渲染过程,并针对常见的问题给出解决方案。至于将json转换为java bean将另有文章进行讲解。
java对象序列化为json有以下几个static方法可以作为入口:
java对象转json:
JSONObject.from(Object bean)
JSONObject.from(Object bean, JsonCofnig cfg)
java集合转json:
JSONArray.from(Object bean)
JSONArray.from(Object bean, JsonCofnig cfg)
还有两个接口可以转任何java元素,包括对象、集合、简单变量、甚至null值等等。
JSONSerializer.toJSON(Object bean)
JSONSerializer.toJSON(Object bean, JsonCofnig cfg)
接口接收两个参数, bean即要序列化为json的java对象,bean可以是简单对象,也可以是聚合对象, cfg即转换配置,可以告诉转换器如何将bean序列化为json。由于以上接口仅仅是转换的对象不同,使用方式完全一样,本文将只针对JSONObject.from(..)进行说明。
将Employee对象转换为json字符串:
Employee employee = new Employee("郑永生", 28, "M");
JSONObject obj = JSONObject.fromObject(employee);
System.out.println(obj.toString());
输出结果如下:
{"age":28,"name":"郑永生","sex":"M"}
序列化过程
java bean序列化为json的方式由JsonConfig进行控制,如果没有指定JsonConfig, json-lib将会创建一个默认的JsonConfig。
开始解析bean时, json-lib会先从JsonConfig中查找当前bean类型对应的json解析器JsonBeanProcessor, 如果配置了解析器将使用配置的解析器解析当前bean对象,如果没有配置则使用默认的解析器来解析bean对象。默认解析器解析过程如下:
创建一个空的JSONObject对象
获取bean中可序列化的属性(按getter方法获取);
过滤掉由transient关键字修饰的属性(属性声明或getter声明上都不能有transient关键字, 可以在jsonConfig中关闭这这个功能);
如果在JsonConfig中给当前bean类型注册 了jsonPropertyFilter, 则执行这个过滤器,过滤掉不需要序列化的属性(jsonPropertyFilter稍后讲解) ;
如果注册了JsonValueProcessor则执行执行这个Processor, 对属性值进行处理(一般序列化日期时在这里进行);
如果注册了propertyNameProcessor则执行这个Processor,对属性名(对应json的key)进行处理(java属性和json key名称不一样可以在这里处理);
将key, value写入JSONObject对象.
如何将java对象用json标示,最终是由解析器来决定的。
json-lib提供以下几种解析器接口:
DefaultValueProcessor: 为java类型指定默认值,我们一般不需要实现这个接口,json-lib提供的默认实现基本上可以满足我们的需要。
JsonBeanProcessor:为java对象指定一个解析器,稍后举例说明。
JsonValueProcessor:为bean的值指定一个解析器,可以将bean中的值输出到json后使用另外的值表示,稍后举例说明
PropertyNameProcessor: 为bean的属性名指定一个解析器,可以将bean中属性名称输出到json后变成另一个名称。
一个JsonConfig对象可以注册多个解析器,既可以为按bean的类型注册解析器,也可以给特定类型的某一个属性指定解析器。
将java bean序列化为json时,有些属性不需要写到json中,这时需要将这些属性过滤掉。
json-lib提供了三种方式来完成这项工作:
在java 类对属性或属性的getter方法用关键字transient修饰。如: private transient double salary;需要在JsonConfig对象中开启这个功能, jsonConfig.setIgnoreTransientFields(true);
在JsonConfig中显示声明需要忽略的属性(推荐使用这种方式), jsonConfig.registerPropertyExclusion(Employee.class, "salary"), 该接口接收两个参数,一个是需要过滤的属性所属的java类, 一个是属性名称。
使用PropertyFilter,这个方式最强大而且灵活,可以在序列化过程中根据bean的类型、名称甚至值进行过滤。
使用PropertyFilter 过滤,需要实现PropertyFilter接口:
public interface PropertyFilter {
* @param source属性所属的java bean对象
* @param name 属性名称
* @param value 属性值
* @return 如果不希望当前属性写入json,则返回true, 否则返回false
boolean apply( Object source, String name, Object value );
将过滤器注册到JavaConfig:javaConfig.setJsonPropertyFilter(propertyFilter );
一般来说,一个JavaCofig只能注册一个过滤器,有时候我们可能需要多个过滤器联合完成属性的过滤,这时可以考虑json-lib提供的几个PropertyFilter的几个实现类:
AndPropertyFilter: 组合两个过滤器实例,当同时满足两个过滤器过滤条件时,属性才会被过滤;
OrPropertyFilter: 组合两个过滤器实例,当属性满足其中一个过滤器过滤条件时,属性就会被过滤;
NotPropertyFilter: 组合一个过滤器A,当属性满足过滤器A时,不对属性进行过滤,否则对属性进行过滤
CompositePropertyFilter: 组合多个过滤器,当属性满足其中一个过滤器过滤条件时,属性就会被过滤;
FalsePropertyFilter:所有属性都不会被过滤;
TruePropertyFilter: 所有属性都会被过滤(不知道这个有什么用, ^_^);
MappingPropertyFilter: 这个是抽象类,可以设置一组键值对存储的过滤器, 每读取到一个bean属性时都会在这一组过滤器中寻找一个过滤器进行过滤,具体使用哪一个过滤器由方法keyMatches来决定。
public abstract class MappingPropertyFilter implements PropertyFilter {
private Map filters = new HashMap();
*@param key 过滤器对应的key值
*@param source bean属性所属的java类
*@param name bean属性名称
*@param value bean属性的值
*@return 返回true时,将使用key指向的过滤器过滤bean属性
protected abstract boolean keyMatches( Object key,
Object source, String name, Object value );
常见问题及解决办法:
日期格式化问题:
json-lib提供的默认日期格式化方法往往不能满足我们的要求,这时可以自定义一个JsonValueProcessor来解析日期:
JsonValueProcessor dateProcessor = new JsonValueProcessor() {
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return processObjectValue(Object value, JsonConfig jsonConfig);
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
return df.format((Date)value);
Employee employee = new Employee("郑永生", 28, "M");
JsonConfig cfg = new JsonConfig();
cfg.registerJsonValueProcessor(Date.class, dateProcessor);
System.out.println(JSONObject.fromObject(employee, cfg));
输出结果如下:
{"age":28,"birthday":"日","name":"郑永生","sex": "M"}
属性值或属性名称的转化
转化属性名和转化属性值用法基本一样,所不同的是实现的解析器接口不同,这里只举例说明值的转化。将bean属性输出到json时用另外的值表示,如下:将性别的'M''F'转化为中文表示:
* 将性别转换为中文标示
JsonValueProcessor sexProcessor = new JsonValueProcessor() {
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
if ("M".equals(value)) {
return "男性";
} else if ("F".equals(value)){
return "女性";
Employee employee = new Employee("郑永生", 28, "M");
JsonConfig cfg = new JsonConfig();
cfg.registerJsonValueProcessor(Employee.class, "sex", sexProcessor);
System.out.println(JSONObject.fromObject(employee, cfg));
bean与json结构不一样:
有时候bean和json的属性(key)并不是一一对应的,比如,bean中的name用一个string属性表示,而json中可能需要用firstName和lastName表示,这时可以用JsonBeanProcessor来实现:
JsonBeanProcessor processor = new JsonBeanProcessor() {
public JSONObject processBean(Object bean, JsonConfig jsonConfig) {
JSONObject json = new JSONObject();
Employee ee = (Employee)
String[] names = ee.getName().split("\\.");
json.put("firstName", names[0]);
json.put("lastName", names[1]);
json.put("age", ee.getAge());
JsonConfig cfg = new JsonConfig();
cfg.registerJsonBeanProcessor(Employee.class, processor);
Employee employee = new Employee("乔治.华盛顿", 28, "M");
System.out.println(JSONObject.fromObject(employee, cfg));
输出结果如下:
{"firstName":"乔治","lastName":"华盛顿","age":28, ...}
附件是一个完整的eclipse工程,里面有更详细的代码示例和依赖的jar包。应该可以直接运行。
下载次数: 26
浏览: 43087 次
来自: 郑州
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'java怎么将json字符串转换为json对象_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
该问题可能描述不清,建议你
java怎么将json字符串转换为json对象
我有更好的答案
name\&;&quot.out:\&徐丽\\&&001122&quot.println(/在这里转换。
S&quot.out:\&;}&转换方法;
JSONObject obj = new JSONObject(str);
// &:&#92.json.*;
public class Demo {
public static void main(String[] args) throws Exception {
String str = &{\&id_no\&;,\id_no&));,\&& /mobile_no&#92.get(&&quot.println(obj);
System:import java.io.*;
import org
为您推荐:
其他类似问题
json的相关知识
换一换
回答问题,赢新手礼包本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 java json字符串 的文章

 

随机推荐