获得json数组里面数组的尺寸,数组进程中的难题

By admin in 4858美高梅 on 2019年4月28日

用作三个前端页面开荒者第3回拍卖json数据,境遇了‘js
获取json数组里面数组的长度’?竟然不掌握json未有.length属性(真是要调侃下自身),少壮不卖力老大徒伤悲啊!从前都以去寻求男朋友支持,不过近来尝试本身去解决遇到的难题。

4858美高梅,作为叁个前端页面开辟者第二次拍卖json数据,际遇了‘js
获取json数组里面数组的尺寸’?竟然不精通json没有.length属性(真是要戏弄下团结),少壮不尽力老大徒伤悲啊!从前都以去寻求男朋友协理,可是近年来尝试本人去消除遭受的主题素材。

用作一个前端页面开荒者第1遍拍卖json数据,碰着了‘js
获取json数组里面数组的长度’?竟然不掌握json未有.length属性(真是要作弄下自身),少壮不奋力老大徒伤悲啊!以前都以去寻求男朋友支持,可是目前尝试本人去化解碰到的难题。

4858美高梅 1

本人际遇的主题素材是这么的:***.jsp结尾的页面里面,后端传给作者的json数据是一个数组,然后要获取第四个数组contacts里面包车型大巴数主管度,然后百度察觉 json未有.length属性。如何是好呢?

获得json数组里面数组的尺寸,数组进程中的难题。自己境遇的标题是那样的:***.jsp结尾的页面里面,后端传给笔者的json数据是一个数组,然后要收获第二个数组contacts里面包车型客车数COO度,然后百度察觉 json未有.length属性。怎么办吧?

自己蒙受的标题是那般的:***.jsp结尾的页面里面,后端传给笔者的json数据是1个数组,然后要拿走第一个数组contacts里面包车型客车数首席营业官度,然后百度发现json未有.length属性。如何是好呢?

json

4858美高梅 2

4858美高梅 3

4858美高梅 4

开卷原来的小说请访问笔者的博客BrightLoong’s
Blog
事先在应用
alibaba的fastjson做数组的连带转变操作的时候境遇有些主题素材,那里把遇到的标题以及哪些缓和的记录如下。

 

 

既然json对象未有length属性,要是要了然她的尺寸怎么办吧?

一. 转变进程中的难题

话不多说,先上代码。

public class JsonTest {
    public static void main(String[] args) {
        //创建一个String数组
        String[][] stringArray = new String[][]{{"1","2","3"},{"4","5","6"}};
        //使用fastjson转为json字符串
        String jsonString = JSON.toJSONString(stringArray);
        System.out.println(jsonString);

        //解析json字符串后输出class发现是jsonArray的。
        Object array = JSON.parse(jsonString);
        System.out.println(array.getClass());
    }
}

出口结果是:

Before class:class [[Ljava.lang.String;
[["1","2","3"],["4","5","6"]]
After class:class com.alibaba.fastjson.JSONArray

凌驾的主题素材如上,把多个数组转为json字符串后,再利用用JSON.parse()调换回来,获取到的class类型却是JSONArray的。

当然你也得以用很简短的艺术把她给调换来须求的String贰维数组。可是小编的急需是:

  1. 只通晓是个数组,知道到数组的原始Class类型(如若是String[][]知道是String.class)
  2. 不明了是几维数组,也不明了最伊始传入的数组的尺寸
  3. 在获得从Json字符串转变回来的object的时候,必须求运用原始类型(比如是String[][],那么调换回来的object,使用object.getClass()应当获得[[Ljava.lang.String),不然无法选拔。

为了解决上述难题,在英特网查阅各样质感无果,最终突然想到查询数组的反射,找到了java.lang.reflect.Array本条包,上边对这么些包里面包车型地铁片段用到做一个简约的牵线。

   

   

var jslength=0;
 for(var js2 in json){
 jslength++;
 } 

二. 关于java.lang.reflect.Array

同样先上代码:

public class ArrayTest {

    /**
     * 创建一维数组.
     * @param cls 数组基本类型Class
     * @param length 创建数组长度
     * @return 创建的数组
     */
    public static Object creatOneDimArray(Class cls, int length) {
        return Array.newInstance(cls, length);
    }

    /**
     * 创建多维数组.
     * @param cls 数组基本类型Class
     * @param dims 维度信息
     * @return 创建的数组
     */
    public static Object creatMultiDimsArray(Class cls, int[] dims) {
        return Array.newInstance(cls, dims);
    }

    /**
     * 获取数组的长度和class信息.
     * @param array 使用Array.newInstance()创建的array
     * @return 长度和class信息
     */
    public static String getArrayInfo(Object array) {
        Class cls = array.getClass();
        //只会返回第一维度的长度,比如String[1][2][3]返回1,String[3][4]返回3
        int length = Array.getLength(array);
        return "CLASS:" + cls + "-----" + "LENGTH:" + length;
    }

    public static void main(String[] args) {
        //创建长度为10的一维String数组
        Object oneArray = creatOneDimArray(String.class, 10);
        System.out.println(getArrayInfo(oneArray));

        //创建一个[2,3,4]的二维String数组
        int[] dims = new int[]{2,3,4};
        Object threeArray = creatMultiDimsArray(String.class,dims);
        System.out.println(getArrayInfo(threeArray));

        //**************************
        //*      数组赋值操作      *
        //**************************

        //---------1.强制转换赋值
        ((String[])oneArray)[1] = "hello";
        ((String[])oneArray)[9] = " world";
        System.out.println(((String[])oneArray)[1] + ((String[])oneArray)[9]);

        ((String[][][])threeArray)[1][2][3] = "hello";
        ((String[][][])threeArray)[0][1][3] = " java";
        System.out.println(((String[][][])threeArray)[1][2][3] + ((String[][][])threeArray)[0][1][3]);

        //--------2.使用Array.set()进行赋值操作
        //使用Array.get()可以获取到下一维的值,比如三维的获取到二维
        //获取三维中index=1的二维数组,Strign[1][][]。
        Object two = Array.get(threeArray,1);
        //从输出可以看到获取到的是一个二维数组
        System.out.println("CLASS:" + two.getClass());
        //对String[1][0][]赋值
        Array.set(two,0,new String[]{"this"," is"," a"," test"});
        System.out.println(((String[][][])threeArray)[1][0][0] + ((String[][][])threeArray)[1][0][1]
                + ((String[][][])threeArray)[1][0][2] + ((String[][][])threeArray)[1][0][3]);

        //再获取一维String[1][1][]
        Object one = Array.get(two,1);
        System.out.println("CLASS:" + one.getClass());

        Array.set(one,0,"my");
        Array.set(one,1," name");
        Array.set(one,2," is");
        Array.set(one,3," brightloong");
        System.out.println(((String[][][])threeArray)[1][1][0] + ((String[][][])threeArray)[1][1][1]
                + ((String[][][])threeArray)[1][1][2] + ((String[][][])threeArray)[1][1][3]);
    }
}

输出结果是:

CLASS:class [Ljava.lang.String;-----LENGTH:10
CLASS:class [[[Ljava.lang.String;-----LENGTH:2
hello world
hello java
CLASS:class [[Ljava.lang.String;
this is a test
CLASS:class [Ljava.lang.String;
my name is brightloong

此处曾经在上述代码中做了大多的表明,那里也不在详细介绍,首要说一下多少个办法的功用。

  • Array.newInstance(Class<?> componentType, int length)Array.newInstance(Class<?> componentType, int... dimensions)首先个用于成立传入类型的尺寸为length的壹维数组,第二个能够用来创造传入类型的多维数组,维度和尺寸由传入的第2个参数决定。
  • Array.get(Object array, int index)用以获取传入的数组array的index下的内容。
  • Array.set(Object array, int index, Object value)用来对传播的数组array的index举办赋值,赋值为value,具体使用见上述的代码。

 

 

把那段代码写成一个方法,现在调用就行了:

3. 怎么样化解转变难点

在具备了以上的了然后,再来化解所碰到的标题。

public class JsonArrayToArray {
    public static void main(String[] args) {
        //创建一个String数组
        String[][] stringArray = new String[][]{{"1","2","3"},{"4","5","6"}};
        //使用fastjson转为json字符串
        String jsonString = JSON.toJSONString(stringArray);
        System.out.println(jsonString);

        //解析json字符串后输出class发现是jsonArray的。
        Object array = JSON.parse(jsonString);
        System.out.println(array.getClass());

        Object realArray = null;
        try {
            realArray = getArrayInstanceByClassAndArg(String.class, array);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        parseJsonArray(array, realArray);
        System.out.println(realArray.getClass());
        System.out.println(realArray.getClass().equals(String[][].class));
    }

    /**
     * 解析jsonArray还原为最开始的数组
     * @param o 解析后的类型是jsonArray的参数
     * @param array 实际要组装的数组
     */
    private static void  parseJsonArray(Object o, Object array) {
        parseJsonArray(o, array, null, 0);
    }

    /**
     * 利用递归调用,解析jsonArray还原为最开始的数组
     * @param o 解析后的类型是jsonArray的参数
     * @param array 实际要组装的数组
     * @param lastArray 上一个array
     * @param index index
     */
    private static void  parseJsonArray(Object o, Object array, Object lastArray, int index) {
        JSONArray tempArray;
        //如果class不是JSONArray,使用Array.set()赋值
        if (!o.getClass().equals(JSONArray.class)) {
            Array.set(lastArray,index , o);
            return;
        }
        //如果是JSONArray,继续继续循环递归调用
        tempArray = (JSONArray)o;
        for (int i = 0; i < tempArray.size(); i++) {
            Object arrayTemp = Array.get(array, i);
            parseJsonArray(tempArray.get(i), arrayTemp, array, i);
        }
    }

    /**
     * 根据class和传入的解析后的类型是jsonArray的参数,获取对应维度和大小的数组
     * @param cls Class
     * @param argValue  解析后的类型是jsonArray的参数
     * @return 返回数组
     * @throws ClassNotFoundException 异常
     */
    private static Object getArrayInstanceByClassAndArg(Class cls, Object argValue)
            throws ClassNotFoundException {
        Object temp = argValue;
        JSONArray tempArray;
        List<Integer> dimsInf = new ArrayList<Integer>();
        //获取jsonArray对应的数组维度和长度
        while (temp.getClass().equals(JSONArray.class)) {
            tempArray = (JSONArray)temp;
            dimsInf.add(tempArray.size());
            temp = tempArray.get(0);
        }
        int[] dims = new int[dimsInf.size()];
        for (int i = 0; i < dimsInf.size(); i++) {
            dims[i] = dimsInf.get(i);
        }
        //返回对应的数组
        return Array.newInstance(cls, dims);
    }
}

出口结果是:

[["1","2","3"],["4","5","6"]]
class com.alibaba.fastjson.JSONArray
class [[Ljava.lang.String;
true

能够看到最终被将退换后的Class为JSONArray的结果在转换为早期的数组类型,String[][],由最后realArray.getClass().equals(String[][].class)再次来到结果true也能够取得实在转变准确了。具体的剖析方法可以看上边的parseJsonArray()方法。

 

 

function getJsonLength(jsonData){
 var jsonLength = 0;
 for(var item in jsonData){
  jsonLength++;
 }
 return jsonLength;
}

 

 

可是地点的办法只可以取获得第1层数组的长度???获取不到子数组里面包车型地铁数首席试行官度???然后小编表明了下,用上边方法成功收获到contacts数组的尺寸。

  既然json对象未有length属性,假使要驾驭他的长短怎么办呢

  既然json对象没有length属性,假诺要清楚她的尺寸如何做呢

var _data = ${contactJson};
function getJsonLength(jsonData){
  var jsonLength = 0;
  for(var item in jsonData){
    if(item == 'contacts'){
      for(var x in jsonData[item]){
        jsonLength++;
      }
    }
  }
  return jsonLength;
}
var _contact_num = getJsonLength(_data);
$('#contactNum').text(_contact_num);  
 var jslength=0;
 for(var js2 in json){
   jslength++;
 }    
 var jslength=0;
 for(var js2 in json){
   jslength++;
 }    

谈到底调出的结果:

        把那段代码写成一个方法,今后调用就行了:

        把那段代码写成四个形式,现在调用就行了:

4858美高梅 5

function getJsonLength(jsonData){
    var jsonLength = 0;
    for(var item in jsonData){
       jsonLength++;
    }
    return jsonLength;
}    
function getJsonLength(jsonData){
    var jsonLength = 0;
    for(var item in jsonData){
       jsonLength++;
    }
    return jsonLength;
}    

以上那篇js
获取json数组里面数组的尺寸实例就是小编分享给大家的全体内容了,希望能给大家多个参阅,也期待我们多多扶助脚本之家。

  不过上边的法子只能博获得第一层数组的尺寸???获取不到子数组里面包车型客车数主管度???然后小编表达了下,用上面方法成功赢得到contacts数组的尺寸。

  但是地点的法子只好获取到第一层数组的长短???获取不到子数组里面包车型地铁数老董度???然后作者表达了下,用上面方法成功赢获得contacts数组的长短。

您或者感兴趣的篇章:

  • JS轻松循环遍历json数组的办法
  • js达成将json数组展现前台table中
  • JS实现给json数组动态赋值的措施言传身教
  • 用javascript对3个json数组深度赋值示例
  • js对象转json数组的粗略达成案例
  • JS实现的JSON数组去重算法示例
  • JS达成键值对遍历json数组功效示例
  • 透过结构AJAX参数达成表单成分JSON相互转变
  • JavaScript兑现组织json数组的法子分析
var _data =  ${contactJson};
function getJsonLength(jsonData){
  var jsonLength = 0;
  for(var item in jsonData){
    if(item == 'contacts'){
      for(var x in jsonData[item]){
        jsonLength++;
      }
    }
  }
        return jsonLength;
}
var _contact_num = getJsonLength(_data);
$('#contactNum').text(_contact_num);  
var _data =  ${contactJson};
function getJsonLength(jsonData){
  var jsonLength = 0;
  for(var item in jsonData){
    if(item == 'contacts'){
      for(var x in jsonData[item]){
        jsonLength++;
      }
    }
  }
        return jsonLength;
}
var _contact_num = getJsonLength(_data);
$('#contactNum').text(_contact_num);  

   最终调出的结果:

   最后调出的结果:

4858美高梅 6

4858美高梅 7

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有