【问题标题】:Deserialize string array to list C#反序列化字符串数组以列出 C#
【发布时间】:2020-09-24 12:12:51
【问题描述】:

我有如下所示的原始 JSON 数据:

{
    "Pages": 0,
    "Page": null,
    "Rows": null,
    "OrderBy": null,
    "Desc": false,
    "TotalRows": 36,
    "HasError": false,
    "Error": null,
    "Result": {
        "fileTypes": [
            {
                "id": 22,
                "description": "Cleaning Procedures",
                "Codes": ""
            },
            {
                "id": 32,
                "description": "Data Drop",
                "Codes": "[\"DB\",\"IE\"]"
            },
            {
                "id": 4,
                "description": "Data Sheet",
                "Codes": ""
            },
            {
                "id": 30,
                "description": "Description of Operation",
                "Codes": ""
            },
            {
                "id": 11,
                "description": "Diagram",
                "Codes": ""
            },
            {
                "id": 2,
                "description": "Drawing",
                "Codes": "[\"DR\"]"
            }
        ]
    }
}

还有一个 C# Model,看起来像这样:

public class Filetype
{
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("description")]
    public string Description { get; set; }
    [JsonProperty("Codes")]
    //public string Codes { get; set; }

    public List<string> Codes { get; set; }
}

但是,Newtonsoft 并未将代码反序列化为代码列表,而是返回

[\"DB\",\"IE\"] 在列表的第一个元素中,或者, "" , (null)。

对此的任何帮助将不胜感激。

【问题讨论】:

  • 不过,这不是正确的期望。 "Codes": "anything here" 是一个字符串,而不是字符串的集合。因此,NewtonSoft 按预期工作。您的输入相当欠佳。
  • Codes 的每个值都用引号引起来,使其成为字符串,而不是数组。 "Codes": "[\"DB\",\"IE\"]" 应该是 "Codes": [\"DB\",\"IE\"]
  • 哦,在这种情况下,您有一个 JSON 字符串 in db。您需要修复服务器端,而不是客户端...因为:如果您将其从 db as a string 中提取出来,请将模型字段设置为该字符串(即 model.Codes = stringFromDB; ),然后序列化为json,你会得到你在这里看到的。
  • @LeszekP 这真的无济于事。双方都可以解决问题,但不能通过自动代码生成来解决。
  • 确实我的评论太短了。它不会修复它,它只是下次如何调试它的提示。如果我要获取字符串列表,但生成的代码只是一个字符串,那么某些内容不正确,需要在 Json/XML 等中进行调查。这只是评论/提示而不是答案,因为已经有来自@matmahnke 的回答。干杯

标签: c# .net-core restsharp


【解决方案1】:

代码具有以下值 "["DB","IE"]" 但是json中的list不需要引号

json中codes的值需要是这样的

 "Codes": ["DB","IE"]

【讨论】:

  • @MichaelLeipper 好的,别碍事:你可以在两边修复这个问题。你更喜欢哪一个?在服务器还是客户端?
【解决方案2】:

客户端:

如果其中一个属性是 Json 的字符串序列化。
您可以使用[JsonIgnore] 添加一个代表反序列化结果的属性:

public class Foo{
    public string BarsInString {get;set;}       
    [JsonIgnore]
    public Bar[] Bars 
    {
        get 
         {
            return JsonConvert.DeserializeObject<Bar[]>(UserInput);
         }
       set 
        {
           BarsInString = JsonConvert.SerializeObject(value);
        }     
    }
}

现场演示:https://dotnetfiddle.net/l5JWVb

我选择了比List&lt;string&gt; 更大的东西来说明。在你的情况下,它可以归结为:

public class Filetype
{
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("description")]
    public string Description { get; set; }
    [JsonProperty("Codes")]
    public string CodesInJson { get; set; }

    [JsonIgnore]
    public List<string> Codes {
        get 
         {
            return JsonConvert.DeserializeObject<List<string>>(CodesInJson);
         }
       set 
        {
           CodesInJson = JsonConvert.SerializeObject(value);
        }     
    }
}

服务器端:

如果其中一个属性是其他内容的 Json 序列化,您可能需要在发送之前对其进行反序列化。使用相同类型的代码:

JsonConvert.DeserializeObject<List<string>>(myJsonFromDb);

【讨论】:

  • 也许值得补充的是,您也可以通过将 json 字符串从 db 反序列化为模型中的 List 来解决此问题在服务器上,然后是再次序列化为 json。如果你告诉他们哪些列实际上是 json,一些 db-Drivers 可以为你做到这一点。 (取决于数据库和驱动程序)
  • 尽我所能把它变成可以理解的东西。我没有添加关于 db-Drivers 的部分,因为我根本不知道它。如果你想添加一些东西,你可以编辑答案。
猜你喜欢
  • 2012-05-10
  • 2017-03-03
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多