JSON格式数据的解析(ActionScript/Java/JavaScript/C#/Objective-C)

之前做老师时(虽然只有短短两月),我仍然被学生们背地里评定为“最想和他一起吃鸡蛋饼的老师”,啊……我是开玩笑,但是我一旦离开某个群体就很难在和那里的大部分人保持接触的问题,当很多人认为我是一个只和有用的人接触的人,不是吧!!我认为,在一起时我一定会努力做交流和回馈,一旦离开,就是和谁比较聊的来就和谁继续交流,这很正常吧?

以上是废话,一个学生某天问我应该如何用C#解析JSON格式的数据,我觉得很难直接给她讲清楚,于是我就想找一款能在Mac OS下写C#的工具,Google说MonoDevelop就可以,我才想起我也是安装了Unity的啊!然后稍微纠结了一会还是3.5版本的Unity,不管怎么样,还是先用它写吧。

Tip:如果发现Mono里面是一片乱码,无法显示正确的中文,可以到,MonoDevelop–>显示包内容–>Contents -> MacOS-> share -> locale,把整个locale文件夹删掉,可以变成英文版本(实测可以,但部分地方仍然是乱码,不过已经可以马上使用了),更妥善的办法在这位老兄写在这了

首先定义一段通用的要解析的数据样例,如下:

{
    'title':'Kill a MonkingBird',
    'author':'Harper.Lee',
    'data':{
    'dealers':[
                   'amazon',
                   'jd',
           'dangdang']
    }

}

然后,我会记录我所能掌握的所有解析JSON代码,并附上样例代码,由于都附上了来源,所以只写了decode的部分,剩余功能请自行展开。

C#

这里用到的是James Newton的JSON.net,网上找到的帖子们一致表示:“这玩意好使”。下载到对应的工具包文件后,将正确的dll文件添加到工程的引用中去,要根据自己系统环境的.net framework选择对应的不同版本,否则会有编译错误或运行时异常。代码如下(示例为Console项目)。

using System;
using Newtonsoft.Json;
using System.Collections.Generic;
namespace JsonDemo
{
    public class Product
    {
      public string title { get; set; }
      public string author { get; set; }
      public CData data { get; set; }
    }
    public class CData
    {
      public IList<string> dealers { get; set; }
    }
    class MainClass
    {
        public static void Main (string[] args)
        {
            string json = @"
                   {
                        'title':'Kill a MonkingBird',
                        'author':'Harper.Lee',
                        'data':{
                        'dealers':['amazon',
                                     'jd',
                               'dangdang']
                                                }

                    }";
            Product product = JsonConvert.DeserializeObject<Product>(json);
            Console.WriteLine (product.data.dealers[0]);
        }
    }
}

源码在此

这里JSON.net做的是基于指定类型的解析,当然它也有基于通用类型的解析办法,详情请猛击帮助文档

白爷还在时(这么说我会被白爷丢入渤海湾么……他老人家只是提前回家过年去了而已),曾经和我推荐过Xamarin Studio,这玩意真是好看啊,难道这就是IDE里面的小清新么,话说它用C#的跨平台移动终端开发的超级理念真的大丈夫么?我会找时间试试看嗯~

[caption id=”” align=”aligncenter” width=”1205”] Xamarin Studio[/caption]

 

ActionScript

从 flash player 11版本开始,ActionScript中开始提供原生的JSON解析支持(干得漂亮!),JSON类被包含在顶级包中,帮助文档在这里,在使用比较旧版本的同人,可以移步这里使用分离出来的纯AS版本。示例代码如下:

package
{
    import flash.display.Sprite;

    public class JSONDemo extends Sprite
    {
        public function JSONDemo()
        {
            var json:String = 
                "{\"title\":\"Kill a MonkingBird\",\"author\":\"Harper.Lee\",\"data\":{\"dealers\":[\"amazon\",\"jd\",\"dangdang\"]}}";
            var jsonObj:Object = JSON.parse(json);
            trace(jsonObj.data.dealers[0]);
        }
    }
}

源码在此

JavaScript

啊,这并不少见啊,我是说用JavaScript处理JSON数据,因为它本身就是JavaScript Object Notation,用原生的eval函数就可以实现String–>Object的转换,不多说,代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>JSONDemo</title>
    <script type="text/javascript">
        var json = "{\"title\":\"Kill a MonkingBird\",\"author\":\"Harper.Lee\",\"data\":{\"dealers\":[\"amazon\",\"jd\",\"dangdang\"]}}";
        var jsonObject = eval('('+json+')');
        alert(jsonObject.data.dealers[0]);
    </script>
</head>
<body>
</body>
</html>

源码在此

想要利用JS做高级的JSON操作,可以使用官方的开源代码json.js

Java

我在项目中实地使用过的库为org.json,开源,比较好用,且较少依赖,代码如下:

import org.json.JSONObject;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String jsonStr = "{\"title\":\"Kill a MonkingBird\",\"author\":\"Harper.Lee\",\"data\":{\"dealers\":[\"amazon\",\"jd\",\"dangdang\"]}}";
        JSONObject json = new JSONObject(jsonStr);
        System.out.println(json.getJSONObject("data").getJSONArray("dealers").getString(0));
    }

}

源码在此

值得注意的是JSON官网介绍的对应各种语言的工具包中,种类最多的是C,C++,C#和Java,都是C的子系,C果然是当仁不让的祖师爷啊。

Objective-C

最后附上最近在二次进击的OBJC中的用法,我采用的是JSONKit,过程中遇到了一些麻烦,关闭ARC检查的办法请参考这里,还有两个会出现的问题,可以直接利用Xcode的自动代码修复直接fix它。还有个较为详细的使用说明在此,示例代码如下:

#import <Cocoa/Cocoa.h>
#import "JSONKit.h"

int main()
{
    NSString *jsonStr = @"{\"title\":\"Kill a MonkingBird\",\"author\":\"Harper.Lee\",\"data\":{\"dealers\":[\"amazon\",\"jd\",\"dangdang\"]}}";
    NSDictionary *jsonResult = [jsonStr objectFromJSONString];
    NSDictionary *data = [jsonResult objectForKey:@"data"];
    NSArray *dealers = [data objectForKey:@"dealers"];
    NSLog(@"%@",[dealers objectAtIndex:0]);

    return 0;
}

源码在此

iOS的学习仍然在继续,所以ObjC知识浅薄,只为提供思路,还望各位多多指教。

20140119补刀

谢谢白爷告知我绕了弯路,也查到了介绍NSJSONSerialization完胜所有其他解析包的帖子。补上代码如下:

#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
#import "JSONKit.h"
int main()
{
    NSString *jsonStr = @"{\"title\":\"Kill a MonkingBird\",\"author\":\"Harper.Lee\",\"data\":{\"dealers\":[\"amazon\",\"jd\",\"dangdang\"]}}";
    NSError *error;
    NSData *nsdata = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:nsdata options:kNilOptions error:&error];
//    NSDictionary *jsonResult = [jsonStr objectFromJSONString];
    NSDictionary *data = [jsonResult objectForKey:@"data"];
    NSArray *dealers = [data objectForKey:@"dealers"];
    NSLog(@"%@",[dealers objectAtIndex:0]);
    return 0;
}