>我可以使用以下代码成功地从以下 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
定义。