【问题标题】:C# - Instance a class that returns JSON objectsC# - 实例化一个返回 JSON 对象的类
【发布时间】:2018-09-02 21:29:22
【问题描述】:

我正在学习 C#,我制作了一个控制台应用程序,它读取文本条目并搜索返回 JSON 值的 API,然后通过控制台显示这些值。 现在我需要将它传递给图形环境,我所做的是创建一个类“MyClass”,并在该类中创建了一个方法“MyMethod”,它将接收一个 15 位数字作为参数并查询 API(例如控制台应用程序所做的),然后返回这些值。

我不知道如何正确创建方法以及如何从另一个类实例化它,因为它会产生错误。

我的 JSON:

{
    "success": true,
    "result": {
        "id": "20429683581",
        "name": "CINEPLEX S.A",
        "Condition": "HABIDO",
        "PLE": "02\/01\/2013",
        "lawyers": [
            {
                "type": "DNI",
                "numdoc": "07871885",
                "name": "PONCE PINTO ALEJANDRO EDUARDO",
                "date": "22\/08\/2000"
            },
            {
                "type": "DNI",
                "numdoc": "09333203",
                "name": "SORIANO BARRANTES JOSE FERNANDO",
                "date": "22\/09\/2008"
            }
        ],
        "workers": [
            {
                "time": "2017-07",
                "service": "8"
            },
            {
                "time": "2018-06",
                "service": "13"
            }
        ]
    }
}

我有这些定义的类:

public class Lawyer
{
    public string type { get; set; }
    public string numdoc { get; set; }
    public string name { get; set; }
    public string date { get; set; }
}

public class Worker
{
    public string time { get; set; }
    public string service { get; set; }
}

public class Result
{
    public string id { get; set; }
    public string name { get; set; }
    public string Condition { get; set; }
    public string PLE { get; set; }
    public List<Lawyer> lawyers { get; set; }
    public List<Worker> workers { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public Result result { get; set; }
}

在控制台应用程序中它们运行良好:

RootObject rootobject;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://www.example.com/api/?get=" + inid);
HttpWebResponse response;

try
{
    response = (HttpWebResponse)request.GetResponse();
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);
    {
        var json = reader.ReadToEnd();
        rootobject = JsonConvert.DeserializeObject<RootObject>(json);
    }
    if (rootobject.success == true)
    {
        Console.WriteLine("---------------");
        Console.WriteLine("ID: " + rootobject.result.id);
        Console.WriteLine("NAME: " + rootobject.result.name);
        Console.WriteLine("CONDITION: " + rootobject.result.Condition);
        Console.WriteLine("PLE: " + rootobject.result.PLE);
    }
    else
    {
        Console.WriteLine("---------------");
        Console.WriteLine("NOTHING");
    }
}
catch (Exception)
{
    Console.WriteLine("---------------");
    Console.WriteLine("ERROR");
}

我已经使用MyClass 迁移到基于 GUI 的应用程序:

class MyClass 
{
    public void MyMethod(int inRUC){
        RootObject rootobject;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://www.example.com/api/?get=" + inRUC);
        HttpWebResponse response;

        response = (HttpWebResponse)request.GetResponse();
        Stream stream = response.GetResponseStream();
        StreamReader reader = new StreamReader(stream);
        {
            var json = reader.ReadToEnd();
            rootobject = JsonConvert.DeserializeObject<RootObject>(json);
        }
    }
}

现在我想在图形表单中获取一个文本条目的值并实例化该类来获取结果并打印在同一个表单的文本字段中,但是我不知道如何正确实例化它以及如何正确放置值,这是我目前正在尝试的: (txtRuc1) 是我的表单输入,EditText1 是我的表单输出:

private void Button1_ClickBefore(object sboObject, SAPbouiCOM.SBOItemEventArg pVal, out bool BubbleEvent)
{
    if (string.IsNullOrEmpty(txtRuc1.Value.ToString()))
    {
        BubbleEvent = false;
    }
    else
    {
//Ok, I known that it is wrong
        BubbleEvent = true;
        MyClass obj = new Sunat();
        EditText1.Value = obj.MyMethod(txtRuc1.value).rootobject.result.name;
    }
}

什么是正确的形式? Visual Studio 返回错误:Cannot convert "string" to "int" in these line:

obj.MyMethod(txtRuc1.value).rootobject.result.name

【问题讨论】:

  • 能不能把json数据和EditText1类代码放上去?
  • 是的,我就是这么说的
  • 需要将字符串解析成int:obj.MyMethod(int.Parse(txtRuc1.value)).rootobject.result.name

标签: c# json class methods


【解决方案1】:

首先,您的MyMethod 需要返回RootObject 而不是void

public RootObject MyMethod(int inRUC){
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://www.example.com/api/?get=" + inRUC);
    HttpWebResponse response;

    response = (HttpWebResponse)request.GetResponse();
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);
    {
        var json = reader.ReadToEnd();
        return JsonConvert.DeserializeObject<RootObject>(json);
    }
}

那么错误是由txtRuc1.value可能是字符串值引起的,但是MyMethod方法需要int

所以你可以尝试使用int.TryParse 方法将输入值解析为int 传递它。

int para = 0;
int.TryParse(txtRuc1.value,out para);

EditText1.Value = obj.MyMethod(para).rootobject.result.name;

【讨论】:

  • 谢谢!!一个小问题...这个方法会调用一次 API 吗?还是会为每个 EditText2.value /EditText3.value 调用 API ...?
  • 当您调用方法并传递参数时,您将调用API
猜你喜欢
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2021-12-22
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多