博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 与 Json的互相转换
阅读量:2229 次
发布时间:2019-05-09

本文共 4752 字,大约阅读时间需要 15 分钟。

 

这几天一直在做Java解析Json数据的一个项目,因为初识json,所以很多东西都是有着懵懂的认识。这里写下我解析时遇到的问题和收获。

   我解析json时用到的是json-lib包。下载地址:。用这个包时,还要用到其他几个支持包:commons-lang.jarcommons-logging.jarcommons-beanutils.jarxom-1.0-2005-01-05.jarezmorph-1.0.1.jar,以上包都可在下载。

 

  先给出2个简单的例子。

1.java2json

样例:

public class testJson{

 public static void main(String[] args) {
    String json = "{\"name\":\"reiz\"}";
    JSONObject jsonObj = JSONObject.fromObject(json);
    String name = jsonObj.getString("name");
     
    jsonObj.put("initial", name.substring(0, 1).toUpperCase());

    String[] likes = new String[] { "JavaScript", "Skiing", "Apple Pie" };

    jsonObj.put("likes", likes);

    Map<String, String> ingredients = new HashMap<String, String>();

    ingredients.put("apples", "3kg");
    ingredients.put("sugar", "1kg");
    ingredients.put("pastry", "2.4kg");
    ingredients.put("bestEaten", "outdoors");
    jsonObj.put("ingredients",ingredients);
     
    System.out.println(jsonObj);
     }

输出结果:

{"name":"reiz","initial":"R","likes":["JavaScript","Skiing","Apple Pie"],"ingredients":{"apples":"3kg","pastry":"2.4kg","bestEaten":"outdoors","sugar":"1kg"}}

java2json的资料网上很多,此不具体研究。

 

2.javafromjson

例子:

public class testJson{

 public static void main(String[] args) {
  String json = "{x:'1',y:'2',userId:'112',element:[{id:'123',name:'haha'},{id:'456',name:'hehe'}]}";
  
   JSONObject obj = JSONObject.fromObject(json);
   String x = obj.getString("x");
   String userid = obj.getString("userId");
   System.out.println("x is:" + x);
   System.out.println("userId is:" + userid);
  
   // 数组array结果:[{"id":"123","name":"haha"},{"id":"456","name":"hehe"}]
   JSONArray jsonArray = obj.getJSONArray("element");
   for (int i = 0; i < jsonArray.size(); i++) {
    System.out.println("element " + i + " :" + jsonArray.get(i));
   }
 }
}    

输出:

x is:1

userId is:112
element 0 :{"id":"123","name":"haha"}
element 1 :{"id":"456","name":"hehe"}

从上例可以看出,若取某一数组,可用json.get(i)取出。若想继续取出数组中第i个元素内的某一个值,如取出数组第一个元素中id的值,可用 (JSONObject)json.get(0).getInt("id")取出,为了看出细节,我们设取第二个元素中name的值,代码如下:

     JSONObject obj2 = JSONObject.fromObject(array.get(1));

     System.out.println(obj2.getString("name"));

   输出结果为 hehe

   可以看出一般步骤为:将要目标字符串转为JSON对象(JSONObject.fromObject()方法),再根据相应方法取出该对象中需要的值。

    如果我们要将json反序列化为javabean呢?

    String jsonStr = "{x:1,\"userId\":\"112\",element:[{id:'123',name:'haha'},{id:'456',name:'hehe'}]}";

   Map<String,Class<?>> m  = new HashMap<String,Class<?>>();
   m.put("x", Integer.class);
   m.put("userId", String.class);
   m.put("element",Element.class);
 
   Jsontobean myBean  = (Jsontobean)JSONObject.toBean( JSONObject.fromObject(jsonStr), Jsontobean.class, m );
   System.out.println("x: " + myBean.getX());
   System.out.println("userId: " + myBean.getUserId());
 
   for(Element e : myBean.getElement()){
     System.out.println(e.getId() +"," + e.getName());
   }

 

public class Jsontobean {

    private int x = 1;
    private String userId = "112";
    private List<Element> element;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public List<Element> getElement() {
        return element;
    }
    public void setElement(List<Element> element) {
        this.element = element;
    }  
}

 

public class Element {

    private int id;
    private String name;
    private Element source;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
 public void setSource(Element source) {
  this.source = source;
 }
 public Element getSource() {
  return source;
 }
    public String toString(){
         return "" + id + "," + name;
    }
}

输出:

x: 1

userId: 112
123,haha
456,hehe

-------

附:

1)JSONObject to DynaBean

所谓动态bean即是java运行的时候根据情况创建的,而不是程序员已经写好了的Bean。JsonLib会自动根据Json格式数据创建字段,然后创建一个包含这些字段的Object。代码片段:

  1. String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";   
  2. JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str );   
  3. DynaBean bean = (DynaBean) JSONSerializer.toJava( jsonObject );   
  4. assertEquals( "JSON", bean.get("string") );         
  5. assertEquals( new Integer(1), bean.get("integer") );         
  6. assertEquals( new Double(2.0), bean.get("double") );         
  7. assertEquals( Boolean.TRUE, bean.get("boolean") );      

2)JSONObject to JavaBean

JSONLIB在转换的时候会自动查找关系,比如子类和父类

例如JSON数据源
    String s = "{'shopList':[{name:'重量',property:'p1'},{name:'尺寸',property:'p2'}, {name:'显卡 类型',property:'p3'},{name:'硬盘容量',property:'p4'},{name:'处理器 ',property:'p5'},{name:'内存',property:'p6'},{name:'型号',property:'p7'}, {name:'货号',property:'p8'},{name:'品牌',property:'p9'}]}";
   存入Map
   map.put("shopList", Shop.class);
   ShopList shopList = (ShopList) JSONObject.toBean(JSONObject.fromObject(s), ShopList.class, map);
JSONObject.toBean()方法的三个参数分别表示数据源对应的JSON对象,转化后的对象ShopList和数据源map。
这种方法和动态转换的区别在于,动态转换仅仅只是转为Object,而静态转换是转换为已经定义过的实体类,会自动映射。介绍。

转载于:https://www.cnblogs.com/interdrp/p/3981155.html

你可能感兴趣的文章
深入理解JVM虚拟机13:再谈四种引用及GC实践
查看>>
Spring源码剖析1:Spring概述
查看>>
Spring源码剖析2:初探Spring IOC核心流程
查看>>
Spring源码剖析5:JDK和cglib动态代理原理详解
查看>>
Spring源码剖析6:Spring AOP概述
查看>>
分布式系统理论基础1: 一致性、2PC和3PC
查看>>
分布式系统理论基础3: 时间、时钟和事件顺序
查看>>
分布式系统理论基础4:Paxos
查看>>
分布式系统理论基础5:选举、多数派和租约
查看>>
分布式系统理论基础6:Raft、Zab
查看>>
分布式系统理论基础8:zookeeper分布式协调服务
查看>>
搞懂分布式技术1:分布式系统的一些基本概念
查看>>
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
查看>>
搞懂分布式技术6:Zookeeper典型应用场景及实践
查看>>
搞懂分布式技术10:LVS实现负载均衡的原理与实践
查看>>
搞懂分布式技术11:分布式session解决方案与一致性hash
查看>>
搞懂分布式技术12:分布式ID生成方案
查看>>
搞懂分布式技术13:缓存的那些事
查看>>
搞懂分布式技术14:Spring Boot使用注解集成Redis缓存
查看>>
搞懂分布式技术15:缓存更新的套路
查看>>