Json 数据解析拾遗

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;
}

Json 数据解析拾遗_第1张图片

3.总结

在Java中也可以使用相应的jar包进行类似操作,与具体语言无关。具体使用哪一种方式,看具体情形,只是小技巧。






你可能感兴趣的:(json,数据)