Исключение Newtonsoft.Json.JsonReaderException: Недопустимый символ идентификатора свойства JavaScript: ,

#c# #json #json.net

#c# #json #json.net

Вопрос:

У меня есть этот код

 var list = new Listlt;longgt;(); long id = 202; list.Add(2000); list.Add(2001); list.Add(2002); var stringOfIds = string.Join(",", list);   var paramList = @"{'ProjectId':"   id   ", 'EntityIDsList': "   stringOfIds   "}"; Console.WriteLine(paramList); var parameters = JsonConvert.DeserializeObjectlt;Dictionarylt;string, objectgt;gt;(paramList); Console.WriteLine(parameters);  

по какой-то определенной причине он не десериализует объект, и он выходит из строя. То, что я пытаюсь здесь сделать, это: преобразовать список длинных строк в строку, разделенную запятыми -gt; построить строкуgt; paramList , а затем десериализовать ее с помощью Newtonsoft.Json . Я считаю, что ошибка где-то в этом stringOfIds , но, к сожалению, не смог ее понять. Знаете ли вы, что я делаю не так и как я могу это исправить?

Ответ №1:

Прямо сейчас ваш фельдшер выглядит так:

 {  "ProjectId": 202,  "EntityIDsList":  2000,  2001,  2002 }  

Что не является правильным JSON. Это должно выглядеть так:

 {  "ProjectId": 202,  "EntityIDsList": [  2000,  2001,  2002  ] }  

Поэтому вам следует изменить его на:

 var paramList = @"{'ProjectId':"   id   ", 'EntityIDsList': ["   stringOfIds   "]}";  

Также на этом этапе Console.WriteLine(parameters); не скажу вам ничего существенного, вам, вероятно, следует изменить его на Console.WriteLine(parameters.ToString());

Ответ №2:

Строка, которая у вас есть, paramList не является допустимым JSON. Объект JSON содержит ключи (и значения, если они являются строками), заключенные в двойные кавычки, а не в одинарные кавычки.

Исправлена строка с экранированными двойными кавычками:

 @"{""ProjectId"": "   id   @", ""EntityIDsList"": """   stringOfIds   @"""}";  

Если ваша цель написания этой строки состоит в том, чтобы преобразовать ее в объект, вы должны непосредственно создать объект. Также обратите внимание, что вы не можете печатать объекты с Console.WriteLine помощью … вам нужно будет сначала преобразовать это в строку ( JsonConvert.SerializeObject ), а затем распечатать ее.

 var parameters = new {  ProjectId = id,  EntityIDsList = stringOfIds }; Console.WriteLine(JsonConvert.SerializeObject(parameters, Formatting.Indented));  // output: {  "ProjectId": 202,  "EntityIDsList": "2000,2001,2002" }  

Если вы хотите, чтобы EntityIDList был списком номеров, измените значение EntityIDsList на list вместо stringOfIds .

 var parameters2 = new {  ProjectId = id,  EntityIDsList = list }; Console.WriteLine(JsonConvert.SerializeObject(parameters2, Formatting.Indented));  //output: {  "ProjectId": 202,  "EntityIDsList": [  2000,  2001,  2002  ] }  

Комментарии:

1. Каждое решение работает по-своему, но это было наиболее подходящим для моей проблемы, поэтому я выбираю это как правильный ответ. Спасибо

Ответ №3:

У вас есть две «проблемы»

  1. вам нужно добавить дополнительные одинарные кавычки вокруг бита stringOfIds
  2. может быть, это на самом деле то, что вы хотите, но… это даст вам словарь с 2 элементами с ключами: «ProjectID» и «EnitityIDsList».

Поскольку список является строковым , вы также можете использовать Dlt;string, stringgt; (или dynamic , в зависимости от того, что вы на самом деле пытаетесь сделать.

Я предполагаю, что вы захотите иметь коллекцию «проектов»? Таким образом, структура в вопросе не будет работать.

 [  { "1": "1001,1002" },  { "2": "2001,2002" } ]  

является ли обычная форма json для словаря элементов

 [  { "1": [1001,1002] },  { "2": [2001,2002] } ]  

в Dlt;string,Listlt;intgt;gt; » а «было бы»лучше».

Настоятельно рекомендуем вам создать классы/записи для представления фигур и их сериализации. Вместо объединения строк. Если вам это необходимо, попробуйте использовать StringBuilder.

Кроме того, хотя Newtonsoft будет обрабатывать одинарные кавычки, на самом деле они не являются частью спецификации. Вы должны экранировать двойные кавычки в строке, если вам действительно нужно сгенерировать json таким образом.

Может быть, это просто сокращенный фрагмент для демонстрации вашей реальной проблемы, и я просто констатирую очевидное 😀

Просто куча наблюдений.

Дополнительные кавычки-это фактическая «проблема» с вашим примером кода.