Newtonsoft.Json.JsonReaderException:无效的 JavaScript 属性标识符字符:,
Posted
技术标签:
【中文标题】Newtonsoft.Json.JsonReaderException:无效的 JavaScript 属性标识符字符:,【英文标题】:Newtonsoft.Json.JsonReaderException: Invalid JavaScript property identifier character: , 【发布时间】:2022-01-08 03:47:46 【问题描述】:我有这个代码
var list = new List<long>();
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.DeserializeObject<Dictionary<string, object>>(paramList);
Console.WriteLine(parameters);
由于某些特殊原因,它不会反序列化对象并崩溃。我在这里尝试做的是:将 long 列表转换为字符串,用逗号分隔 -> 构造 paramList
字符串,然后使用 Newtonsoft.Json
反序列化它。我相信错误在stringOfIds
的某个地方,但遗憾的是无法弄清楚。你知道我做错了什么吗?我该如何解决?
【问题讨论】:
【参考方案1】:现在你的 paramList 看起来像这样:
"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
]
【讨论】:
每个解决方案都以自己的方式工作,但这是最适合我的问题,所以我选择它作为正确答案。谢谢【参考方案3】:你有两个“问题”
-
您需要在 stringOfIds 位周围添加额外的单引号
也许它实际上是您想要的,但是...这将为您提供一个包含 2 个项的字典:“ProjectId”和“EnitityIDsList”。
由于列表是字符串化的,您也可以使用D<string, string>
(或dynamic
,具体取决于您实际尝试执行的操作。
我猜你会想要一个“项目”的集合?所以问题中的结构不起作用。
[
"1": "1001,1002" ,
"2": "2001,2002"
]
是项目字典的普通 json 格式
[
"1": [1001,1002] ,
"2": [2001,2002]
]
改成D<string,List<int>>
会“更好”。
强烈建议您创建类/记录来表示形状并对其进行序列化。而不是字符串连接。如果必须,请尝试使用 StringBuilder。
此外,虽然 Newtonsoft 会处理单引号,但它们实际上并不是规范的一部分。如果您确实需要以这种方式生成 json,则应该将双引号转义到字符串中。
也许这只是一个简化的 sn-p 来演示您的实际问题,我只是在说明显而易见的:D
只是大量的观察。
额外的引号是您的示例代码的实际“问题”。
【讨论】:
以上是关于Newtonsoft.Json.JsonReaderException:无效的 JavaScript 属性标识符字符:,的主要内容,如果未能解决你的问题,请参考以下文章