C# 正在尝试反序列化json数组
我正在尝试反序列化项目中的一个本地文件,它是一个json文件。但是,我在当前代码中遇到此错误: 分析值时遇到意外字符:G.路径“”,第0行,位置0 C#代码 我试图从中反序列化的Json文件。这只是从文件中提取的一个快速示例。它相当大^^C# 正在尝试反序列化json数组,c#,json,serialization,C#,Json,Serialization,我正在尝试反序列化项目中的一个本地文件,它是一个json文件。但是,我在当前代码中遇到此错误: 分析值时遇到意外字符:G.路径“”,第0行,位置0 C#代码 我试图从中反序列化的Json文件。这只是从文件中提取的一个快速示例。它相当大^^ [ { "id":707860, "name":"Hurzuf", "country":"UA", "coord":{ "lon":34.283333, "lat":44
[
{
"id":707860,
"name":"Hurzuf",
"country":"UA",
"coord":{
"lon":34.283333,
"lat":44.549999
}
},
{
"id":519188,
"name":"Novinki",
"country":"RU",
"coord":{
"lon":37.666668,
"lat":55.683334
}
},
您似乎对JSON反序列化的工作方式有一些巨大的误解。首先要解决的问题是,您不应该遍历json文件的行。正如评论中指出的,您的JSON文件非常大(~180万行),因此最好使用
JsonReader
重载的反序列化对象()
,请参阅:
List cities=newlist();
字符串filepath=Application.StartupPath+@“\city.list.json”;
使用(StreamReader sr=新的StreamReader(文件路径))
使用(JsonReader=newjsontextreader(sr))
{
JsonSerializer serializer=新的JsonSerializer();
//从流中读取json
//json大小无关紧要,因为一次只能从HTTP请求中读取一小段内容
cities=JsonConvert.DeserializeObject(读卡器);
}
请注意这一行:
cities = JsonConvert.DeserializeObject<List<City.values>>(reader);
cities=JsonConvert.DeserializeObject(读卡器);
这里我们利用JSON.NET进行反序列化。你的代码和我在这里包含的代码之间的区别在于,你的JSON是一个对象集合,这意味着你需要反序列化到你的City.values
对象集合中,在本例中,我使用了列表
现在我们有了一个变量
cities
,它是JSON中包含的City.values
对象的集合。您似乎对JSON反序列化的工作方式有很大的误解。首先要解决的问题是,您不应该遍历json文件的行。正如评论中指出的,您的JSON文件非常大(~180万行),因此最好使用JsonReader
重载的反序列化对象()
,请参阅:
List cities=newlist();
字符串filepath=Application.StartupPath+@“\city.list.json”;
使用(StreamReader sr=新的StreamReader(文件路径))
使用(JsonReader=newjsontextreader(sr))
{
JsonSerializer serializer=新的JsonSerializer();
//从流中读取json
//json大小无关紧要,因为一次只能从HTTP请求中读取一小段内容
cities=JsonConvert.DeserializeObject(读卡器);
}
请注意这一行:
cities = JsonConvert.DeserializeObject<List<City.values>>(reader);
cities=JsonConvert.DeserializeObject(读卡器);
这里我们利用JSON.NET进行反序列化。你的代码和我在这里包含的代码之间的区别在于,你的JSON是一个对象集合,这意味着你需要反序列化到你的City.values
对象集合中,在本例中,我使用了列表
现在我们有了一个变量
cities
,它是JSON中包含的City.values
对象的集合。您需要一个包含City数组的类,您当前没有,这里有些问题,为什么要逐行读取文件,但反序列化文件路径
?您应该将所有文本读入一个字符串并反序列化,无需循环。感谢优化建议Ron:D,ehm,该文件有180万行长,所以我只是尝试获取文件中的前40行,这就是我执行for循环的原因。我仍然可以按照你的方式,只获取前40行而不进行循环吗?不,因为从JSON文件中随机抽取一个“块”是无效的JSON,会丢失一些结束括号。你明白吗,在循环中读取文件40次,然后对每个要反序列化该字符串的字符串(JSON的一部分)进行反序列化但是你反序列化了文件的路径….?你需要一个包含City数组的类,你目前没有,这里有些问题,为什么你逐行读取文件,但反序列化文件路径
?您应该将所有文本读入一个字符串并反序列化,无需循环。感谢优化建议Ron:D,ehm,该文件有180万行长,所以我只是尝试获取文件中的前40行,这就是我执行for循环的原因。我仍然可以按照你的方式,只获取前40行而不进行循环吗?不,因为从JSON文件中随机抽取一个“块”是无效的JSON,会丢失一些结束括号。你明白吗,在循环中读取文件40次,然后对每个要反序列化该字符串的字符串(JSON的一部分)进行反序列化但是相反,您反序列化了文件的路径……?如果文件很长(实际上是180万行),我不会这样做。我宁愿直接流。请参见。@dbc很好的调用,起初我以为OP使用的是reallalllines()
(实际上与ReadAllText相同)。我在问题中添加了一条关于绩效的注释谢谢,非常感谢您的回答。然而。我只对反序列化文件中的“id”和“name”行感兴趣。我之前有过这个解决方案,但是我找不到方法来反序列化我想要的特定行。@HelpIsNeeded-只需从c#数据模型中省略不需要的属性,序列化程序就会在从文件流反序列化时跳过这些属性。@HelpIsNeeded您的类可以就是这些属性。您不必有一个匹配整个对象的POCO如果文件很长(即180万行),我不会这样做。我宁愿直接流。请参见。@dbc很好的调用,起初我以为OP使用的是reallalllines()
(实际上与ReadAllText相同)。我在问题中添加了一条关于绩效的注释谢谢,非常感谢您的回答。然而。我只对反序列化文件中的“id”和“name”行感兴趣。我之前有过这个解决方案,但我发现
List<City.values> cities = new List<City.values>();
string filepath = Application.StartupPath + @"\city.list.json";
using (StreamReader sr = new StreamReader(filepath))
using (JsonReader reader = new JsonTextReader(sr))
{
JsonSerializer serializer = new JsonSerializer();
// read the json from a stream
// json size doesn't matter because only a small piece is read at a time from the HTTP request
cities = JsonConvert.DeserializeObject<List<City.values>>(reader);
}
cities = JsonConvert.DeserializeObject<List<City.values>>(reader);