Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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数组_C#_Json_Serialization - Fatal编程技术网

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

我正在尝试反序列化项目中的一个本地文件,它是一个json文件。但是,我在当前代码中遇到此错误:

分析值时遇到意外字符:G.路径“”,第0行,位置0

C#代码

我试图从中反序列化的Json文件。这只是从文件中提取的一个快速示例。它相当大^^

[
   {
      "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);