首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NewtonJson中检查API /empty错误并在C#中显示DataSet

如何在NewtonJson中检查API /empty错误并在C#中显示DataSet
EN

Stack Overflow用户
提问于 2019-12-26 09:44:47
回答 1查看 84关注 0票数 0

我正在尝试显示数组或值的简单元素,下面是我的JSON字符串(来自python pandas的API )

代码语言:javascript
复制
{
    "msg": "success",
    "state": 10000,
    "data": {
        "data": [
            {
                "index": 0,
                "test_1": 110,
                "test_2": "000001",
                "test_3": "CN",
                "test_4": "Bank",
                "test_5": 893,
                "test_6": 229
            }
        ],
        "schema": {
            "fields": [
                {
                    "type": "integer",
                    "name": "index"
                },
                {
                    "type": "string",
                    "name": "test_1"
                },
                {
                    "type": "string",
                    "name": "test_2"
                },
                {
                    "type": "number",
                    "name": "test_3"
                },
                {
                    "type": "number",
                    "name": "test_4"
                },
                {
                    "type": "number",
                    "name": "test_5"
                },
                {
                    "type": "string",
                    "name": "test_6"
                }
            ],
            "pandas_version": "0.20.0",
            "primaryKey": [
                "index"
            ]
        }
    }
}

下面的C#代码是我正在使用的查询TestDataset.cs

代码语言:javascript
复制
using System;
using System.IO;
using System.Net;
using Newtonsoft.Json.Linq;
using ExcelDna.Integration;
using Excel = Microsoft.Office.Interop.Excel;
namespace Test_Atune
{
    public class Request
    {
        Excel.Application ExcelApp = (Excel.Application)ExcelDnaUtil.Application;
        public object GetDatasetFromUrl(string root, string path, string headval, Excel.Range excelAddress)
        {
            string historicalData= "{}";
            var webConnection = new WebClient();
            webConnection.Headers.Add("Host", headval);
            try
            {
                historicalData = webConnection.DownloadString(root+path);
            }
            catch (WebException ex)
            {
                string error_str = ex.Message;
                if (ex.Status.ToString() == "ConnectFailure" || ex.Status.ToString() == "Timeout")
                {
                    root = Constant.setURL_ROOT_COMMON(root);
                    try
                    {
                        historicalData= webConnection.DownloadString(root + path);
                    }
                    catch (WebException ex2)
                    {
                        return "";
                    }
                }
            }
            finally
            {
                webConnection.Dispose();
            }

            JObject jsonFeed = JObject.Parse(historicalData);
            Excel.Range range = excelAddress;
            JObject B = new JObject();
            JArray data = (JArray)jsonFeed["data"]["data"];
            JArray columns = (JArray)jsonFeed["data"]["schema"]["fields"];
            int rowNum = data.Count;
            int colNum = columns.Count;
            Excel.Range range_head = ExcelApp.Cells[range.Row + 1, range.Column];
            range_head = range_head.get_Resize(1, colNum);
            Excel.Range range_data = ExcelApp.Cells[range.Row + 2, range.Column];
            range_data = range_data.get_Resize(rowNum, colNum);
            // write header
            object[,] headerData = new object[1, colNum];
            for (int iCol = 0; iCol < colNum; iCol++)
            {
                headerData[0, iCol] = columns[iCol]["name"];
            }
            range_head.Value2 = headerData;

            // write data
            object[,] cellData = new object[rowNum, colNum];
            int iRow = 0;
            foreach (JObject jo in data)
            {
                var a = jo["test_code"];
                for (int iCol = 0; iCol < colNum; iCol++)
                {
                    if (columns[iCol]["test_1"].ToString() == "string")
                    {
                        cellData[iRow, iCol] = "'" + jo[columns[iCol]["name"].ToString()];
                    }
                    else
                    {
                        cellData[iRow, iCol] = jo[columns[iCol]["name"].ToString()];
                    }
                }
                iRow += 1;
            }
            range_data.Value2 = cellData;
            return "Total" + rowNum.ToString() + "cells";
        }
    }

}

下面是request.cs的代码

代码语言:javascript
复制
using ExcelDna.Integration;
using Excel = Microsoft.Office.Interop.Excel;
namespace Test_Atune
{
    public class Dataset
    {
        public static string baseurl = Constant.URL_ROOT_COMMON;
        public static string headval = Constant.HEADVAL_COMMON;
        public static Request request = new Request();

        [ExcelFunction(Category = "test", IsMacroType = true, Description = "test dataset")]
        public static object TEST_DATASET(
                    [ExcelArgument(Description = "test_code")] string test_1,
                    [ExcelArgument(Description = "YYYYMMDD")] string test_2,
                    [ExcelArgument(Description = "YYYYMMDD")] string test_3
                    )
        {
            string parstr = @"/test_dataset/?" +
                @"test_1=" + test_1 +
                @"&test_2=" + test_2 +
                @"&test_3=" + test_3;
            ExcelReference caller = (ExcelReference)XlCall.Excel(XlCall.xlfCaller);
            Excel.Range rg = caller.ToPiaRange();
            return ExcelAsyncUtil.Run("TEST_DATASET",
                new object[] { parstr },
                () => request.GetDatasetFromUrl(Constant.URL_ROOT_COMMON, parstr, headval, rg));
        }
    }

}

我在JArray columns = (JArray)jsonFeed["data"]["schema"]["fields"];上得到了下面的错误

代码语言:javascript
复制
System.NullReferenceException HResult=0x80004003  message=Object reference not set to an instance of an object.

我试着调试得到了下面的结果,Name: historicalData, Value:"{}"; Name: jsonFeed,Vaule:Null; Name:B,Vaule:{{}}, Name:data, Value:"null"

我是C#的新手,这是一个数组,域,url问题,还是其他的问题?我该怎么做呢?非常感谢你的建议。

EN

回答 1

Stack Overflow用户

发布于 2019-12-26 09:56:44

错误:未将对象引用设置为对象的实例。这意味着["data"]["data"]["schema"]["data"]["schema"]["fields"]下的一个或所有数据不存在。

我刚刚测试了您的代码,基于给定的json,下面的代码工作得很好。

JArray columns = (JArray)jsonFeed["data"]["schema"]["fields"];

建议:使用调试器,看看jsonFeed的值是否正确,因为这是我唯一不能重现的东西。如果无法使用调试器,请在已分析的对象上使用.ToString()来记录已分析的对象。(jsonFeed.ToString())

注意:你的json有一个问题。建议"test_3": CN,为CN上带引号的"test_3": "CN",

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59483101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档