1.前言
Json 数据解析是RestAPI开发过程中非常常见的,最主流的做法是将Json对象映射成实体类,然后再使用该实体类。这种做法在数据结构层次比较浅,Json数据涉及的信息比较少的时候,是理想的一种解决方案,实际情形下,接受的Json数据包含的信息量非常大,层次结构非常深。我们在设计相应的实体类的时候,需要很深的层次,并且从Json转化成实体类的时候,效率也是很低的。在实际的情形中,我们并不需要Json中所有的信息,通常一半的信息就足够了,这时候我们就需要按需进行获取。这只是以一个小技巧,网上也有很多这种例子,这里只作为一个探讨。
2.Json解析
在前言部分,对于有较多Json转化为实体类开发经验的人来说,应该体会很深了,但是如果没有相关的开发经验,那么还是没有深刻的感受。下面就来看看三种常见方式。
1)直接操作
自己写Helper类解析Json,然后赋值给类的实例的属性。这种做法估计已经废弃了,因为有很多的工具可以很方便地做这件事,比如Newtonsoft。
2)使用Json到实体类的映射
我们以DaoCloud Api 中的Json数据映射到实体类为例。
DaoProject Json
{ "id": "90d58d34-e1ca-4724-9d7c-9af7e3635f12", "name": "mongo_demo", "repo": "daocloud/mongo_demo", "src_provider": "github", "status": "Success", "package_id": "e5033330-978f-4466-97d1-625c57a7943f", "created_at": "2015-12-01T06:25:57+00:00" }我们使用的实体类DaoProject
public class DaoProject { public string Id { set; get; } public string Name { set; get; } public string Repo { set; get; } public string Src_provider { get; set; } public string Status { get; set; } public string Package_id { set; get; } public DateTime Created_at { set; get; } }我们采用RestSharp进行自动转换,方法体如下:
public static DaoProject GetProject(string appId) { var request = new RestRequest("build-flows/{appId}", Method.GET); request.AddHeader("Authorization", "token " + daoToken); request.AddUrlSegment("appId", appId); IRestResponse<DaoProject> response = client.Execute<DaoProject>(request); var content = response.Data; return content; }这个时候,我们的一个Json数据涉及的信息(属性)比较少,层次也不深(只有一层),我们很好去构建实体类,那么在另一个Json数据中,属性就很多,层次也很深了。
下面是DaoApp的Json数据:
{ "app": [ { "package": { "id": "1b6b9e72-f127-41fe-8290-cc3df8dfdf19", "image": "daocloud.io/daocloud/daocloud" }, "state": "RUNNING", "created_at": "2015-12-19T07:55:10+00:00", "last_operated_at": "2015-12-14T08:46:11+00:00", "release_name": "v1.0.0", "app_runtime": { "id": "a849cdf2-c79e-4c29-83ca-50751cc388a5" "name": "S0", "display_name": "自有集群" }, "id": "a5fad5a6-b967-4436-bcfd-1978110ea8cb", "name": "open-api", "enable_auto_redeploy": true } ] }如果我们要构建这样一个类,我们需要构建多层次的对象,非常不方便,实际使用的时候,我们只需要构建一个简单类,然后在解析的时候,直接取值赋值给相应的属性即可。
比如我们构建DaoApp类如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DaoCloudModel { public class DaoApp { public string Id { set; get; } public string Name { set; get; } public string State { set; get; } } }转换的方式如下:
public static DaoApp GetApps() { var request = new RestRequest("apps", Method.GET); request.AddHeader("Authorization", "token " + daoToken); IRestResponse response = client.Execute(request); JObject jsonObject = (JObject)JsonConvert.DeserializeObject(response.Content); DaoApp daoApp = new DaoApp { Id = jsonObject["app"][0]["id"].ToString(), Name = jsonObject["app"][0]["name"].ToString(), State = jsonObject["app"][0]["state"].ToString() }; return daoApp; }
3.总结
在Java中也可以使用相应的jar包进行类似操作,与具体语言无关。具体使用哪一种方式,看具体情形,只是小技巧。