Newtonsoft.Json.JsonReaderException: 无效 JavaScript 属性 标识符字符: ,

Newtonsoft.Json.JsonReaderException: Invalid JavaScript property identifier character: ,

我有这个代码

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);

由于某些特殊原因,它没有反序列化对象并且崩溃了。我在这里要做的是:将长整数列表转换为字符串,以逗号分隔 -> 构造 paramList 字符串,然后使用 Newtonsoft.Json 反序列化它。我相信错误在 stringOfIds 中的某个地方,但遗憾的是无法弄清楚。你知道我做错了什么吗?我该如何解决?

现在您的参数列表如下所示:

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

你有两个“问题”

  1. 您需要在 stringOfIds 位周围添加额外的单引号
  2. 也许这正是您想要的,但是...这将为您提供一个字典,其中包含 2 个带键的项目:“ProjectId”和“EnitityIDsList”。

由于列表是字符串化的,您也可以使用 D<string, string>(或 dynamic,具体取决于您实际要执行的操作。

我猜你会想要一组“项目”?所以题中的结构不行。

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

是项目字典的正常 json 形式

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

变成D<string,List<int>>会“更好”。

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

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

也许这只是一个演示您的实际问题的缩减片段,我只是在说明显而易见的问题 :D

只是一堆观察结果。

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

您的字符串 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
  ]
}