【Grasshopper基础5】在GH里看基金? —— 简单电池项目实战

本文介绍了如何使用Grasshopper创建一个电池,通过网络API获取基金净值数据,并处理输入验证与输出格式。通过实例演示了数据获取、解析和结果输出的全过程。

经过前面【Grasshopper基础1~4】的介绍,相信读者已经了解了如何在Visual Studio里创建电池、如何获取数据、如何传出数据。

那么在了解这些原理之后,就让我们来一起实现一个小的项目,来看看一个电池从头到尾到底如何制作吧。

正如标题中所述的,我们今天就来做一个 “在GH里看基金净值” 的小电池,大致就是实现一个“给定基金代码,通过网络API调用获取基金净值信息,并输出该基金的所有净值信息”。要实现这个功能,首先我们需要首先进行需求分析,然后确定实现的逻辑,最后进行代码编写和简单的测试。


需求分析

“给定基金代码”
一般而言,基金代码都是整型数值,但是考虑到日常使用的时候,基金代码前可能会包含数字0,故认为它会是整型或者是字符串。
不过,我们在前文(【Grasshopper基础3】)中已经了解到了,由于GH里字符串(GH_String)和整型(GH_Integer)会自动进行隐式转换,其实不需要担心到底会是整形还是字符串,只需确定我们代码最终接受的类型,GH会在输入参数中自动帮我们进行类型转换。

“输出该基金的所有净值信息”
基金净值是浮点型,但是由于需要获取所有净值信息,包含历史上基金存在时所有的值,所以对应每一个基金代码应该会附带一个列表的信息。净值是浮点型。

经过上述分析,

  1. 电池的输入端需要一个参数,可以是整型或字符串,这个项目我们就直接采用整型;
  2. 输出端需要一个参数,是浮点型;
  3. 输入和输出直接的对应关系是一个整型输入对应一个浮点型列表,确定输入端的参数的Access属性为item,输出端的参数的Access属性为list

此时可以开一个Visual Studio,新建一个Grasshopper电池项目,然后将我们的输入、输出端的参数相关代码放入了。

protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
{
   
   
    pManager.AddIntegerParameter("Code", "C", "", GH_ParamAccess.item);
}
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
   
   
    pManager.AddNumber("DayValues", "v", "", GH_ParamAccess.list);
}

电池内部实现逻辑

这部分是整个电池项目中最耗时的部分,也就是在电池类的 SolveInstance 中处理输入的基金代码信息,并给出最终的净值浮点数列表。

首先获取基金代码:

protected override void SolveInstance(IGH_DataAccess DA)
{
   
   
    // 获取基金代码,检测获取是否成功,若不成功直接退出电池执行
    int code = int.MinValue;
    bool Success = DA.GetData(0, ref code);
    if(!Success) return;
}

然后就是对基金净值API的调用,这里调用的是 “小熊同学”网站的基金API。这个API的返回值是一个json字符串,里面包含基金的名称、代码、净值等信息,详细的API文档可在网站中找到。

现在的问题就聚焦到两个部分了,一个是如何发送网络请求,另一个是如何在返回的json字符串中提取我们需要的信息。

网络请求的发送

由于我们是在Grasshopper中实现该逻辑,所以运行环境是 .NET Framework 4.5。在网络上找资料时也需要时刻注意运行环境。目前.NET生态已经布局到全平台,很多相关网络请求的资料找到的都是 .NET Core 或者 .NET 的,而 .NET Framework 与它们略有不同,依赖项可能会不一样。

(具体 .NET / .NET Core / .NET Framework 三者有什么区别和联系读者们也可以自行探索一下,相关历史介绍还是挺多的)

在 .NET Framework 框架下,网络请求的发送可以使用 System.Net 命名空间里的 WebRequest 类实现。

protected override void SolveInstance(IGH_DataAccess DA)
{
   
   
    // 获取基金代码,检测获取是否成功,若不成功直接退出电池执行
    // .... ... .. . 略
    // 建立请求
    var req = WebRequest.Create(@"https://api.doctorxiong.club/v1/fund/detail?code=" + code.ToString());
    req.Method = "GET";
    req.Headers.Add(HttpRequestHeader.AcceptCharset, "utf-8");
    // 发起请求,将请求返回保存至res中
    var res = req.GetResponse();
}

返回的Json字符串解析

接下来,就需要对返回的json字符串进行解析了。考虑到现在网络编程的便利性,json字符串几乎已经成为网络编程中数据往来的标准格式,所以json字符串的解析就不需要手写了,.NET 框架已经自带了json字符串解析的功能(System.Text.Json),可以自动将json字符串封装成一个 C# 的object提供原生访问,十分方便。

但是,这个 System.Text.Json.NET Framework 中是没有的!所以我们需要用到它的前生 Newtonsoft.Json。不过这个dll需要手动添加,具体添加方法为

  1. 在Visual Studio的项目管理器中找到引用(References)并右键单击,选择添加引用
  2. 弹出窗口中,左上角选择 Assemblies -> Extensions
  3. 找到并选择 Json.NET,单击确定添加,此时引用中出现 Newtonsoft.Json

在这里插入图片描述

引用添加成功后我们就可以在代码中加入命名空间

using Newtonsoft.Json;

此时我们离解析成功仅差一步之遥了。

前面提到用使用Newtonsoft.Json可以自动把json字符串转换为一个可以操作的对象实例,其前提是,这个对象实例我们需要有这个对象的数据模型

想象json是一堆货物,Newtonsoft.Json可以帮忙装货,但是它需要知道每种货物需要被装在什么位置,我们需要指明数据会被装在什么对象的什么属性中。

数据模型其实就是一个类,我们需要依据json的格式去构建这个类的属性,下面就直接给出笔者建立的数据模型。笔者在这里使用的是struct结构体,读者也可以自行换成class关键字。

// 数据模型中每一个属性都对应着json字符串中的标签
// 数据模型可以不包含所有的json字符串标签,不包含的数据会被忽略掉
public struct ResponseData
{
   
   
    public HttpStatusCode Code {
   
    get; set; }
    public string Message {
   
    get; set; }
    public Fund Data {
   
    get; set; }
    public string Meta {
   
    get; set; }
    public struct Fund
    {
   
   
        public string Code {
   
    get; set; }
        public string Name {
   
    get; set; 
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值