今天开始自己的第一篇博文,谈谈在JavaScript中如何将自定义类型转换为JSON对象。

    那么首先要谈谈for与for in的用法。对于遍历来说,大家都不陌生尤其对于数据结构精通的人来说。本文并不是要在这里提出更好的遍历方法,而只是做出说明。在此后面我们通过遍历来进行对象转为JSON对象。

    在Java中有很多中方式,如for, foreach,以及一些接口的next()方法来进行遍历,但是在JavaScript中我们如何去遍历呢?

    对于在数组中,我们通常这样去遍历:

 
  
  1. var arr = {"a""b""c"}; 
  2. for(var i = 0; i< arr.length; i += 1){ 
  3.     alert(arr[i]); 

    同样假如数组中的内容为我们自己定义的对象时,我们也可以通过这种方式来得到数组中的对象。但是对于一个对象而言我们要去对他内容部进行遍历,我们如何操作呢?

    这时候for in就派上用场了。我们可以这样进行对一个自定义的对象进行如下遍历。

 
  
  1. // 创建一个简单的对象 
  2. var Person = function(name, age){ 
  3.    this.name = name; 
  4.    this.age = age; 
  5.  
  6. // 转换为json字符串 
  7. function toJson(source){ 
  8.    var json = []; 
  9.    for(var key in source){ 
  10.       json.push([key, ":", source[key]].join(" ")); 
  11.    } 
  12.    return "{" + json.join(", ") + "}"

    相信在看到这里大家似乎也应该明白for in的作用了吧。其实也就是for in去遍历对象的属性,然后由于对象可以通过属性名称去获取到具体的值。

    对象转换为JSON字符串代码如下(用这种最清楚的函数式而非面向对象方式):

 

 
  
  1. // 传入对象,生成对象json 
  2. function toJSON(source){ 
  3.      var json = []; 
  4.      var jsonStr = ""
  5.      if(source instanceof Array){ 
  6.         jsonStrArray = []; 
  7.         for(var i =0; i < source.length; i +=1){ 
  8.             jsonStrArray.push([toJsonString(source[i])].join("")); 
  9.         } 
  10.         jsonStr ="["+jsonStrArray.join(", ")+"]"
  11.      } else { 
  12.     jsonStr = toJsonString(source); 
  13.      } 
  14.     return jsonStr; 
  15.      
  16. // 将对象转换为json字符串 
  17. function toJsonString(obj){ 
  18.      var msg = []; 
  19.      for(var key in obj){ 
  20.      msg.push([key, ":", obj[key]].join(" ")); 
  21.      } 
  22.      return "{" + msg.join(", ") + "}"
  23.      
  24. // 对象 
  25. function Person(name, age){ 
  26.      this.name = name; 
  27.      this.age = age; 
  28.      
  29. // 传递数组对象 
  30. var persons = []; 
  31. persons.push(new Person("Young", 23)); 
  32. persons.push(new Person("Gump", 23)); 
  33. alert(toJSON(persons)); 
  34.  
  35. // 传递普通对象 
  36. alert(toJSON(new Person("Yong", 22)));