解决 JSON到一个没有正确显示的列表框

kwhelchel.

众所周知的成员
加入
2月28日,2020年2月28日
消息
51
编程经验
Beginner
好的,这两件事在这里发生了。
首先,当添加ListBox项目时,我正在收到此功能。"确定 - system.collections.generic.list`1 [system.string] - system.collections.generic.list`1 [classlibraryapi.report]"
其他时候它没有加载,这是它拉动的例外。"system.nullreferenceException:'对象引用未设置为对象的实例。"
此部分根据报告所选择的内容提出报告。

我认为两个都与彼此有关,但不能弄清楚这一点。

列表框的Winform代码

winform:
           {
                ReportViewlistbox.Items.Clear();
                GetReport p = new GetReport();
                var client = new RestClient(p.WebGetReport);
                client.Timeout = -1;
                var request = new RestRequest(Method.POST);
                request.AddHeader("Content-Type", "Value");
                request.AddHeader("Content-Type", "Value");
                var thisJsonStr = "{\"Credentials\":{\"ApiKey\":\"string (CompactGUID)\",\"MerchantID\":\"string\",\"StoreID\":\"string\",\"Username\":\"string\",\"Password\":\"string\"}}", ParameterType.RequestBody);
                request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
                request.AddParameter("application/json", thisJsonStr, ParameterType.RequestBody);
                IRestResponse response = client.Execute(request);
                var viewreport = Viewreport.FromJson(response.Content);
                ReportViewlistbox.Items.Add($"{viewreport.Result} - {viewreport.ReportHeader} - {viewreport.Reports}");

            }

这是我的班级

Class:
public partial class Viewreport
{
    [JsonProperty("Result")]
    public string Result { get; set; }

    [JsonProperty("ReportHeader")]
    public List<string> ReportHeader { get; set; }

    [JsonProperty("Reports")]
    public List<Report> Reports { get; set; }
}

public partial class Report
{
    [JsonProperty("ReportID")]
    [JsonConverter(typeof(ParseStringConverter))]
    public long ReportId { get; set; }

    [JsonProperty("ReportTxt")]
    public List<string> ReportTxt { get; set; }
}

public partial class Viewreport
{
    public static Viewreport FromJson(string json) => JsonConvert.DeserializeObject<Viewreport>(json, ClassLibraryApi.Converter.Settings);
}

public static class Serialize
{
    public static string ToJson(this Viewreport self) => JsonConvert.SerializeObject(self, ClassLibraryApi.Converter.Settings);
}

internal static class Converter
{
    public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
        DateParseHandling = DateParseHandling.None,
        Converters =
        {
            new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
        },
    };
}

internal class ParseStringConverter : JsonConverter
{
    public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);

    public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null) return null;
        var value = serializer.Deserialize<string>(reader);
        long l;
        if (Int64.TryParse(value, out l))
        {
            return l;
        }
        throw new Exception("Cannot unmarshal type long");
    }

    public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
    {
        if (untypedValue == null)
        {
            serializer.Serialize(writer, null);
            return;
        }
        var value = (long)untypedValue;
        serializer.Serialize(writer, value.ToString());
        return;
    }

    public static readonly ParseStringConverter Singleton = new ParseStringConverter();
}

和邮差得到了什么。
Postman:
{
    "Result": "OK",
    "ReportHeader": [
        "     公司:Pizza Schmizza  -  Pearl",
        "    Run Time: 02/05/21 09:27AM",
        "报告:当前#1"
    ],
    "Reports": [
        {
            "ReportID": "34",
            "ReportTxt": [
                " ",
                "报告组:曼迪报告",
                "-----------------------------------------",
                " ",
                "REPORT PRESET: Employee Hours",
                " ",
                " ",
                "EMPLOYEE SHIFTS:",
                " ",
                "    Employee           Job          Time In        Time Out       Reg     OT     Hours     Pay   ",
                "----------------|--------------|---------------|---------------|-------|-------|-------|---------",
                "F, Tanner       |MANAGER       |02/05/21 08:32A|02/05/21 09:27A|   0.93|   0.00|   0.93|    15.14",
                "----------------|--------------|---------------|---------------|-------|-------|-------|---------",
                "                |              |               |               |   0.93|   0.00|   0.93|    15.14"
            ]
        }
    ]
}
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
那是因为:
C#:
ReportViewlistbox.Items.Add($"{viewreport.Result} - {viewreport.ReportHeader} - {viewreport.Reports}");
只是一个速记:
C#:
string result = viewreport.Result.ToString();
string reportHeader = viewreport.ReportHeader.ToString();
string reports = viewreport.Reports.ToString();
string item = String.Format("{0} - {1} - {2}", result, reportHeader, reports);
ReportViewlistbox.Items.Add(item);

Since C#'s default implementation of ToString() just returns the type name, and since ReportHeaderReports are both List<string>, then you are getting the result that you are getting.

I don't know why you were expecting C# to expand out the contents of a List<T>. It's not JavaScript.
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
现在尝试更换:
C#:
string reportHeader = viewreport.ReportHeader.ToString();

C#:
string reportHeader = String.Join(", ", viewreport.ReportHeader);
并看看会发生什么。
 

kwhelchel.

众所周知的成员
加入
2月28日,2020年2月28日
消息
51
编程经验
Beginner
@skydiver. 这适用于报表线,但报告行仍然在listbos中抛出classlibraryapi.report。
Reports line:
     Company: Pizza - Pearl,     Run Time: 02/07/21 07:31AM, 报告:当前#1 - ClassLibraryApi.Report

我已将其添加到其中,以便在视图中排列排行。这也是我想要的。

Break by line:
 string[] values = item.Split(',');

                foreach (string value in values)
                {
                    if (value.Trim() == "")
                        continue;
                    ReportViewlistbox.Items.Add(value.Trim());
                }

非常感谢你
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
*sigh*. You need to write custom code to enumerate each of the Reports inside the list, and the generate a string for each of those Report. To help with that process, read:

 

kwhelchel.

众所周知的成员
加入
2月28日,2020年2月28日
消息
51
编程经验
Beginner
我有一个json文件的输出,我一直在尝试到我想要的格式。我在regex101上使用的表达式很好,但是当我将它添加到Visual Studio中的C#时,我得到了红色的冲突线。此格式化以适合列表框,然后保存为文本文件后。我确实在使用部分中列出了这一点"使用system.text.regularexpressions;"。我也知道我可以在添加正则表达式之前将数据添加到列表框中。


Winform code:
                IRestResponse response = client.Execute(request);

                var item = (response.Content);

                string pattern = @"(?-m)(?s)(?<="ReportHeader"\:\[\").+(?=\"\])";
                string input = item;
                MatchCollection collection = Regex.Matches(input, pattern);
                foreach (Match m in collection)
                {
                   ReportViewlistbox.Items.Add(m.Value);
                }

regex code to read:
{"Result":"OK"
"ReportHeader":["     公司:Pizza Schmizza  -  Pearl"
"    Run Time: 02/12/21 05:17AM"
"报告:当前#1"]
"Reports":[{"ReportID":"34"
"ReportTxt":[" "
"报告组:曼迪报告"
"-----------------------------------------"]}]}
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+
引用转义序列是""在逐字中。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+
虽然它看起来在您的帖子中(从某种观众复制?),但数据可能是JSON,在这种情况下可以,应该用例如JSON.NET库而不是正则表达式读取。
 

kwhelchel.

众所周知的成员
加入
2月28日,2020年2月28日
消息
51
编程经验
Beginner
这是这里的JSON数据,我不能为我的生活获得任何通过报告线来显示出这个错误classlibraryapi.report []。
并指示尝试使用Regex格式化输出到所需的输出。因为我只需要报告标题信息和ReportTxt Info。
所以说实话,我很迷失在这里。


Json String:
{
    "Result": "OK",
    "ReportHeader": [
        "     公司:Pizza Schmizza  -  Pearl",
        "    运行时间:02/13/21 06:37 AM",
        "报告:当前#1"
    ],
    "Reports": [
        {
            "ReportID": "34",
            "ReportTxt": [
                " ",
                "报告组:曼迪报告",
                "-----------------------------------------"
            ]
        }
    ]
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+
使用JSON.NET和Jobject读取UNTYWORD的数据:
C#:
var json = JObject.Parse(input);
foreach (var header in json["ReportHeader"])
    Debug.WriteLine(header.ToString().Trim());
foreach (var report in json["Reports"])
    foreach (var txt in report["ReportTxt"])
        Debug.WriteLine(txt);
更好地为键入的访问创建类:
C#:
class ReportMain
{
    public string Result { get; set; }
    public string[] ReportHeader{ get; set; }
    public Report[] Reports { get; set; }
}
class Report
{
    public string ReportID { get; set; }
    public string[] ReportTxt { get; set; }
}
使用类的相同示例:
C#:
var main = JsonConvert.DeserializeObject<ReportMain>(input);
foreach (var header in main.ReportHeader)
    Debug.WriteLine(header.Trim());
foreach (var report in main.Reports)
    foreach (var txt in report.ReportTxt)
        Debug.WriteLine(txt);
示例输出:
公司:Pizza Schmizza - Pearl
运行时间:02/13/21 06:37 AM
报告:当前#1

报告组:曼迪报告
-----------------------------------------
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
你已经有一个关于这个的线程。合并线程......
 
最佳 底部