Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中解析复杂的JSON?最后,我希望在DataGridView中显示结果_C#_Json_Parsing - Fatal编程技术网

如何在C#中解析复杂的JSON?最后,我希望在DataGridView中显示结果

如何在C#中解析复杂的JSON?最后,我希望在DataGridView中显示结果,c#,json,parsing,C#,Json,Parsing,这是我第一次用C#解析复杂的JSON,我对这样解析JSON结构有点困惑。但是,我成功地解析了简单的JSON。我在这里包括JSON和我遵循的方法: [{ “L1”:空, “L2”:{ “名称”:“XXX”, “联系人”:“xxxxx”, “地址”:“XXXX” } }, { “L1”:{ “性别”:“XXX”, “联系人”:“xxxxx”, “邮件地址”:“XXXX” }, “L2”:空 }] 我使用两个单独的类,如下所示: 公共类L2 { 公共字符串名称{get;set;} 公共字符串联系人{

这是我第一次用C#解析复杂的JSON,我对这样解析JSON结构有点困惑。但是,我成功地解析了简单的JSON。我在这里包括JSON和我遵循的方法:

[{
“L1”:空,
“L2”:{
“名称”:“XXX”,
“联系人”:“xxxxx”,
“地址”:“XXXX”
}
},
{
“L1”:{
“性别”:“XXX”,
“联系人”:“xxxxx”,
“邮件地址”:“XXXX”
},
“L2”:空
}]
我使用两个单独的类,如下所示:

公共类L2
{
公共字符串名称{get;set;}
公共字符串联系人{get;set;}
公共字符串地址{get;set;}
}
公共级L1
{
公共字符串{get;set;}
公共字符串联系人{get;set;}
公共字符串邮件地址{get;set;}
}
公共类根{
专用L1 L1{get;set;}
私有L2{get;set;}
}
我使用这些行来解析:

 string jsonText = File.ReadAllText("log_test.txt");
 List<Root> data = (List<Root>)JsonConvert.DeserializeObject<List<Root>>(jsonText);
string jsonText=File.ReadAllText(“log_test.txt”);
列表数据=(列表)JsonConvert.DeserializeObject(jsonText);

当我运行它时,它运行时没有任何错误,但我的最终目标是在表(或DataGridView)中显示所有结果。如何访问每个属性?在第一个对象中,L1没有任何字段,但在第二个对象中有字段。那么我该怎么做“L1.性别”?感谢您的帮助。谢谢

您缺少Json的根类。 使用此网站创建所有类。 您将得到以下信息。 这将确保映射所有字段

List<Root> myDeserializedClass = JsonConvert.DeserializeObject<List<Root>>myJsonResponse); 
public class L1
{
    public string gender { get; set; }
    public string contact { get; set; }
    public string mail_address { get; set; }
}

public class L2
{
    public string Name { get; set; }
    public string contact { get; set; }
    public string address { get; set; }
}

public class Root
{
    public L1 L1 { get; set; }
    public L2 L2 { get; set; }
}
List myDeserializedClass=JsonConvert.DeserializeObjectmyJsonResponse);
公共级L1
{
公共字符串{get;set;}
公共字符串联系人{get;set;}
公共字符串邮件地址{get;set;}
}
公共级L2
{
公共字符串名称{get;set;}
公共字符串联系人{get;set;}
公共字符串地址{get;set;}
}
公共类根
{
公共L1 L1{get;set;}
公共L2{get;set;}
}

Imo L1和L2不是属性名称。并具有变量名

我们可以定义一个联系人类:

public partial class Contact
{
    [JsonProperty("gender", NullValueHandling = NullValueHandling.Ignore)]
    public string Gender { get; set; }

    [JsonProperty("contact")]
    public string ContactContact { get; set; }

    [JsonProperty("mail_address", NullValueHandling = NullValueHandling.Ignore)]
    public string MailAddress { get; set; }

    [JsonProperty("Name", NullValueHandling = NullValueHandling.Ignore)]
    public string Name { get; set; }

    [JsonProperty("address", NullValueHandling = NullValueHandling.Ignore)]
    public string Address { get; set; }
}
并反序列化如下:

var result = JsonConvert.DeserializeObject<List<Dictionary<string, Contact>>>(input);
// result[0]["L2"] To access L2 values.

现场演示

什么是
解析器
?这是一节课吗?如果是,请将您的问题包括在内,感谢您的回复。是的,那是我的课。我只是稍微修改了我的问题和代码。您能看一下吗?在根类L1和L2中,它们是私有的,应该是公共的。您可以使用访问可能为空的成员,例如
Root.L1?.gender
。请看:,或者。事实上,这可能是它们的复制品,同意吗?如果没有,请回答您的问题以澄清您的困境。也许你正在寻找类似或?的东西,谢谢你的回复。很抱歉,我没有提到我已经包含了根类,它与您提到的相同。我仍然有这个问题。你给我的站点给了我类型为Root的DeserialedClass,但你提到它是一个列表。是的,你的json是一个列表,这就是为什么我修改了网站上的代码以更好地匹配你的问题@Pratikshresthad您是否合并了这两个独立的类?此外,Dump函数在我的系统上不起作用。Dump函数特定于此在线Edi。它用于在屏幕上转储内容。我没有合并任何类。我以为是一样的。两者在逻辑上没有区别。这些看起来像是联系信息。我没有看到一个域名,我将性别与邮件配对,而不是与姓名或Adress配对。空值和空值在序列化时可以忽略。例如,对于显示名称,您可以执行
contactInformation.value.Name
对于L1 L2,这很简单。你将如何处理L3?您是否会重新编译所有代码以创建属性?@PratikShrestha-我的主要目标是获取这些值并将其显示在DataGridView或DataTable上。你也能帮我吗?还有,我将如何执行LINQ操作关于堆栈溢出的规则是询问,因此您应该询问另一个问题。
var flatternResult = result.SelectMany(x=>x);
foreach (var contactInformation in flatternResult) {
    Console.Write($"\n\n{contactInformation.Key}: is null? {contactInformation.Value == null}\n");
    Console.WriteLine(""
       +"\n Address         : "+ contactInformation.Value?.Address
       +"\n ContactContact  : "+ contactInformation.Value?.ContactContact
       +"\n Gender          : "+ contactInformation.Value?.Gender
       +"\n MailAddress     : "+ contactInformation.Value?.MailAddress
       +"\n Name            : "+ contactInformation.Value?.Name
    );

}