无法将 JSON 数组反序列化为 C# 对象 [关闭]

Posted

技术标签:

【中文标题】无法将 JSON 数组反序列化为 C# 对象 [关闭]【英文标题】:Unable Deserialize JSON Array to C# object [closed] 【发布时间】:2021-09-28 12:24:24 【问题描述】:

我有一个 html 页面和一些进行 AJAX 调用的 javascript 代码。在我的 API(C#) 的服务器端,我收到一个 JSON 数组,如下所示,它最多可以有 60 个元素。对于每个元素,我都映射了一个类对象。

但是我无法将数组反序列化为任何 C# 对象。我尝试过 Array[]、ArrayList 甚至 MyObject[],但都没有。

有人可以帮助我如何将每个元素反序列化为 MyObject。

我在 Visual Studio 中添加断点并检查时收到一些“非法字符”消息。

[
      
        "PosX": 1458,
        "PosY": 198,
        "Rotation": 250,
        "Width": 63,
        "Height": 25,
        "URL": "http://localhost:7071/2.png",
        "Name": "10",
        "RawURL": "/Case16/10-2.png",
        "BelongsTo": "k",
        "AppliedRotation": 96,
        "ImageID": 49
      ,
      
        "PosX": 1418,
        "PosY": 563,
        "Rotation": 118,
        "Width": 28,
        "Height": 68,
        "URL": "http://localhost:707/11.png",
        "Name": "10",
        "RawURL": "/Case16/10-1.png",
        "BelongsTo": "karyotype",
        "AppliedRotation": 174,
        "ImageID": 48
      
    ]

【问题讨论】:

您需要一个key 来映射对象开头的arraydata:[....] 我有 data.Session 包含上述内容。 "[]" 似乎不适用于嵌套这样的对象和数组。 嗯,这就是我在服务器上得到的结果 仅仅因为它不是有效的JSON,并不意味着我们应该关闭这篇文章。让我们通过解释如何处理这个来提供帮助 【参考方案1】:

JSON 格式不支持给定结构,您可以使用任何其他 Json 验证器工具(如 JSON lint)对其进行验证。

您可以通过删除外部大括号“”或为对象数组添加属性(例如“ImageInfo”)来解决此问题。



"ImageInfo":[
  
    "PosX": 1458,
    "PosY": 198,
    "Rotation": 250,
    "Width": 63,
    "Height": 25,
    "URL": "http://localhost:7071/2.png",
    "Name": "10",
    "RawURL": "/Case16/10-2.png",
    "BelongsTo": "k",
    "AppliedRotation": 96,
    "ImageID": 49
  ,
  
    "PosX": 1418,
    "PosY": 563,
    "Rotation": 118,
    "Width": 28,
    "Height": 68,
    "URL": "http://localhost:707/11.png",
    "Name": "10",
    "RawURL": "/Case16/10-1.png",
    "BelongsTo": "karyotype",
    "AppliedRotation": 174,
    "ImageID": 48
  
 ]

【讨论】:

【参考方案2】:

如果您可以编码/控制服务器,那么您应该更新该 logi 以产生有效的语法。如果您有自定义 AJAX 处理代码,当它与 JSON 对象的模式不匹配时,故意尝试包装响应以使其看起来像 json,那么您应该更新该逻辑以注入属性内容的名称,Value 听起来像是一个很好的通用名称......其他答案将提供进一步的指导。

如果您无法影响字符串并且遇到无效的 JSON 响应,那么我们可以简单地在代码中清理响应您尝试反序列化它:

    string json = @"[
    
        ""PosX"": 1458,
        ""PosY"": 198,
        ""Rotation"": 250,
        ""Width"": 63,
        ""Height"": 25,
        ""URL"": ""http://localhost:7071/2.png"",
        ""Name"": ""10"",
        ""RawURL"": ""/Case16/10-2.png"",
        ""BelongsTo"": ""k"",
        ""AppliedRotation"": 96,
        ""ImageID"": 49
    ,
    
        ""PosX"": 1418,
        ""PosY"": 563,
        ""Rotation"": 118,
        ""Width"": 28,
        ""Height"": 68,
        ""URL"": ""http://localhost:707/11.png"",
        ""Name"": ""10"",
        ""RawURL"": ""/Case16/10-1.png"",
        ""BelongsTo"": ""karyotype"",
        ""AppliedRotation"": 174,
        ""ImageID"": 48
    
]";

// we don't control this, but server or AJAX callback is wrapping the JSON array as an object.
if (json.StartsWith("[") && json.EndsWith("]"))
    json = json.TrimStart('').TrimEnd('');

// Now you can try to deserialize:
var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ImagePoco>>(json);
foreach(var image in list)

    Console.WriteLine($"[image.ImageID] (image.PosX,image.PosY) image.Name 'image.URL'");

这会产生以下输出:

[49] (1458,198) 10 'http://localhost:7071/2.png'
[48] (1418,563) 10 'http://localhost:707/11.png'

我使用这个类验证了上面的代码,你可以跟着这个小提琴:https://dotnetfiddle.net/JK2JAZ

public class ImagePoco

    public int PosX  get; set; 
    public int PosY  get; set; 
    public int Rotation  get; set; 
    public int Width  get; set; 
    public int Height  get; set; 
    public string URL  get; set; 
    public string Name  get; set; 
    public string RawURL  get; set; 
    public string BelongsTo  get; set; 
    public int AppliedRotation  get; set; 
    public int ImageID  get; set; 

【讨论】:

【参考方案3】:

您能否尝试移除

[
  
    "PosX": 1458,
    "PosY": 198,
    "Rotation": 250,
    "Width": 63,
    "Height": 25,
    "URL": "http://localhost:7071/2.png",
    "Name": "10",
    "RawURL": "/Case16/10-2.png",
    "BelongsTo": "k",
    "AppliedRotation": 96,
    "ImageID": 49
  ,
  
    "PosX": 1418,
    "PosY": 563,
    "Rotation": 118,
    "Width": 28,
    "Height": 68,
    "URL": "http://localhost:707/11.png",
    "Name": "10",
    "RawURL": "/Case16/10-1.png",
    "BelongsTo": "karyotype",
    "AppliedRotation": 174,
    "ImageID": 48
  
]

【讨论】:

或者添加属性名 是的,所以这是“ ”的问题。我能够删除它,然后一切都从那里开始。

以上是关于无法将 JSON 数组反序列化为 C# 对象 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串

在 C# 中将 JSON 数组反序列化为对象

使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]

无法将当前 JSON 数组(例如 [1,2,3])反序列化为具有复杂和嵌套对象的类型

如何将 JSON 返回反序列化为从 RestSharp 调用到 API 的对象数组?

在调用API后,将JSON对象反序列化为C#类[重复]。