如何处理 System.ArgumentOutOfRangeException 错误,当通过属性名称从 JSON 获取值



>我可以使用以下代码成功地从以下 JSON 中提取数据:

string json = @"{
"person": {
"name": "John",
"age": 30,
"cars": [
{
"make": "Ford",
"model": "Focus",
"year": 2003
},
{
"make": "Toyota",
"model": "Yaris",
"year": 2015
}
]
}
}";
JObject rss = JObject.Parse(json);
string name = (string)rss["person"]["name"];
//This will return John
string car1 = (string)rss["person"]["cars"][0]["make"];
//This will return Ford
string car2 = (string)rss["person"]["cars"][1]["make"];
//This will return Toyota

如果 JSON 更改并且 car 数组仅包含一个项目,则 car2 会出现以下错误:

类型为"System.ArgumentOutOfRangeException"的未处理异常 发生在 mscorlib.dll 附加信息:索引已用完 范围。必须是非负数且小于集合的大小。

这是因为汽车阵列的位置 1 中没有项目。如果发生这种情况,我希望将 car2 字符串设置为空字符串。

有没有办法在尝试提取值之前检查项目是否存在?

我在下面包含了伪代码来解释我想要实现的目标:

if exists(rss["person"]["cars"][1]["make"])
then string car2 = (string)rss["person"]["cars"][1]["make"]
else string car2 = ""

提前致谢

参考资料 - https://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm

我认为您可能只需要先检查汽车的数量。

JArray cars = (JArray)rss["person"]["cars"];
string car1 = "";
string car2 = "";
if(cars.Count > 0)
{
car1 = (string)cars[0]["make"];
}
if(cars.Count > 1)
{
car2 = (string)cars[1]["make"];
}

检查点网提琴

您可以使用JsonConvert.DeserializedObject方法将 json 字符串转换为类型化对象。根据提供的输入,Json 类将表示如下:

public class Car
{
public string make { get; set; }
public string model { get; set; }
public int year { get; set; }
}
public class Person
{
public string name { get; set; }
public int age { get; set; }
public List<Car> cars { get; set; }
}
public class PersonResponse
{
public Person person { get; set; }
}

使用上述类型,输入 Json 可以按如下方式转换:

var personResponse = JsonConvert.DeserializeObject<PersonResponse>(json);

现在,可以通过以下方式访问汽车:

var car1 = personResponse.Person.cars.First()?.make;

和 car2 作为

if (personResponse.Person.cars != null && personResponse.Person.cars > 1)
{
car2 = personResponse.Person.cars[1].make;
}

使用上述类型化类,您无需自己键入强制转换。

此处引用了DeserializeObject定义。

最新更新