【问题标题】:Newtonsoft.Json.JsonReaderException: Invalid JavaScript property identifier character: ,Newtonsoft.Json.JsonReaderException:无效的 JavaScript 属性标识符字符:,
【发布时间】: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 的某个地方,但遗憾的是无法弄清楚。你知道我做错了什么吗?我该如何解决?

【问题讨论】:

    标签: c# json json.net


    【解决方案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】:

      你有两个“问题”

      1. 您需要在 stringOfIds 位周围添加额外的单引号
      2. 也许它实际上是您想要的,但是...这将为您提供一个包含 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

      只是大量的观察。

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

      【讨论】:

        猜你喜欢
        • 2019-07-09
        • 2013-01-28
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多