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());
你有两个“问题”
- 您需要在 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>>
会“更好”。
强烈建议您创建 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
]
}
我有这个代码
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());
你有两个“问题”
- 您需要在 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>>
会“更好”。
强烈建议您创建 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
]
}