gpt4 book ai didi

c# - 如何在 C# 中解析 JSON 子集合

转载 作者:行者123 更新时间:2023-11-30 17:59:11 25 4
gpt4 key购买 nike

编辑:下面的问题似乎是放在“items”数组上的“bars”标签。我尝试使用“JavaScriptSerializer”和“NewtonSoft”工具,但当该集合就位时它会出错。错误:无法将当前 JSON 对象(例如 {\"name\":\"value\"})反序列化为 输入 'System.Collections.Generic.List...

我从对 RESTful 网络服务的调用中获得了一个 JSON 返回字符串。我已经想出如何将其转换为 C# 对象。

示例 JSON:

{
"property1": "value1",
"property2": "value2"
}

JSON 解析到的示例类:

public class FooClass
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}

我在 System.Web.Extensions 命名空间中使用“JavaScriptSerializer”类...效果很好!

现在,如果 JSON 有一个集合项怎么办?像这样:

{
"property1": "value1",
"property2": "value2",
"bars": {
"items": [
{
"sub_property1": "sub_value1",
"sub_property2": "sub_value2"
},
...
]
}
}

我想为我的“FooClass”类做这样的事情:

public class FooClass
{
public string Property1 { get; set; }
public string Property2 { get; set; }
public List<BarClass> Bars { get; set; }
}

public class BarClass
{
public string Sub_Property1 { get; set; }
public string Sub_Property2 { get; set; }
}

有没有办法告诉 JavaScriptSerializer 类“items”数组等同于“Bars”,以便它们可以“解析”到类中?

感谢您在这里提供的任何建议。

最佳答案

当然——这种行为是自动发生的。重要的是你的 BarClass 有一个无参数的构造函数(我认为这对于一般的序列化类也是常见的)。 JavaScriptSerializer 反序列化方法接受您的类型以用于重构对象并遍历您类中的所有子类型。

From the documentation on MSDN : "在反序列化过程中,序列化程序的当前类型解析器被引用,它决定了在转换嵌套在数组和字典类型中的元素时要使用的托管类型。因此,反序列化过程遍历输入的所有嵌套元素。"

using System.Collections.Generic; 
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
class Program
{


private static void Main(string[] args)
{
var person = new Person();
person.Name = "reacher gilt";
person.Address = "100 East Way";
person.Age = 74;
person.Aliases = new List<string>(new []{"teddy", "freddy", "eddy", "Betty"});
person.Bars = new List<BarClass>(new[]{
new BarClass("beep","boop"),
new BarClass("meep","moop"),
new BarClass("feep","foop"),
});
JavaScriptSerializer serializer = new JavaScriptSerializer();

string jsonString = serializer.Serialize(person);

var rehydrated = serializer.Deserialize<Person>(jsonString);
}

}


class Person
{
public string Name { get; set; }

public string Address { get; set; }

public int Age { get; set; }

public List<string> Aliases;
public List<BarClass> Bars { get; set; }
}
class BarClass
{
public string Sub_Property1 { get; set; }
public string Sub_Property2 { get; set; }
public BarClass() { }
public BarClass (string one, string two)
{
Sub_Property1 = one;
Sub_Property2 = two;
}
}
}

编辑:在罗布教练的澄清评论之后:

using System.Collections.Generic;
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
class Program
{


private static void Main(string[] args)
{
var person = new Person();
person.Name = "reacher gilt";
person.Address = "100 East Way";
person.Age = 74;
person.Aliases = new List<string>(new []{"teddy", "freddy", "eddy", "Betty"});
person.Bars = new Dictionary<string, List<BarClass>>();

person.Bars.Add("items",
new List<BarClass>(new[]{
new BarClass("beep","boop"),
new BarClass("meep","moop"),
new BarClass("feep","foop"),
}));
JavaScriptSerializer serializer = new JavaScriptSerializer();

string jsonString = serializer.Serialize(person);

var rehydrated = serializer.Deserialize<Person>(jsonString);
}

}


class BarClass
{
public string Sub_Property1 { get; set; }
public string Sub_Property2 { get; set; }
public BarClass() { }
public BarClass (string one, string two)
{
Sub_Property1 = one;
Sub_Property2 = two;
}
}

class Person
{
public string Name { get; set; }

public string Address { get; set; }

public int Age { get; set; }

public List<string> Aliases;
public Dictionary <string, List<BarClass> >Bars { get; set; }
}
}

这让你像 json 一样:

{
"Aliases":
[
"teddy",
"freddy",
"eddy",
"Betty"
],
"Name":"reacher gilt",
"Address":"100 East Way",
"Age":74,
"Bars":
{
"items":
[
{
"Sub_Property1":"beep",
"Sub_Property2":"boop"
},

{
"Sub_Property1":"meep",
"Sub_Property2":"moop"
},

{
"Sub_Property1":"feep",
"Sub_Property2":"foop"
}
]
}
}

我还看到有人使用 DataContractJsonSerializer,这确实是 一种 序列化为 json 的方法,但问题中指定了 System.Web.Script.Serialization.JavaScriptSerializer。

关于c# - 如何在 C# 中解析 JSON 子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11422730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com