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&lt;string, string&gt;(或dynamic,具体取决于您实际尝试执行的操作。

我猜你会想要一个“项目”的集合?所以问题中的结构不起作用。

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

是项目字典的普通 json 格式

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

改成D&lt;string,List&lt;int&gt;&gt; 会“更好”。

强烈建议您创建类/记录来表示形状并对其进行序列化。而不是字符串连接。如果必须,请尝试使用 StringBuilder。

此外,虽然 Newtonsoft 会处理单引号,但它们实际上并不是规范的一部分。如果您确实需要以这种方式生成 json,则应该将双引号转义到字符串中。

也许这只是一个简化的 sn-p 来演示您的实际问题,我只是在说明显而易见的:D

只是大量的观察。

额外的引号是您的示例代码的实际“问题”。

【讨论】:

以上是关于Newtonsoft.Json.JsonReaderException:无效的 JavaScript 属性标识符字符:,的主要内容,如果未能解决你的问题,请参考以下文章