【问题标题】:Deserializing JSON when fieldnames contain spaces当字段名包含空格时反序列化 JSON
【发布时间】:2014-04-20 13:52:45
【问题描述】:

我正在编写一个读取 JSON 文件的工具。我正在使用 NewtonSoft 工具将 JSOn 反序列化为 C# 类。这是一个示例片段:

 "name": "Fubar",
 ".NET version": "4.0",
 "binding type": "HTTP",

字段名称包含在 C# 标识符中无效的空格和其他字符(.)。 这样做的正确方法是什么?

(很遗憾,我没有更改 JSON 格式的选项。)

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

    使用JsonProperty 属性来指示JSON 中的名称。例如

    [JsonProperty(PropertyName = "binding type")]
    public string BindingType { get; set; }
    

    【讨论】:

      【解决方案2】:

      System.Text.Json

      如果您使用System.Text.Json,则等效属性为JsonPropertyName

      [JsonPropertyName(".net version")]
      public string DotNetVersion { get; set; }
      

      下面的例子:

      public class Data
      {
          public string Name { get; set; }
      
          [JsonPropertyName(".net version")]
          public string DotNetVersion { get; set; }
      
          [JsonPropertyName("binding type")]
          public string BindingType { get; set; }
      }
      
      // to deserialize
      var data = JsonSerializer.Deserialize<Data>(json);
      

      【讨论】:

        【解决方案3】:

        不知道为什么,但这对我不起作用。在这个例子中,我每次都简单地为“BindingType”返回一个空值。实际上,我发现将 Json 结果下载为字符串然后执行以下操作要容易得多:

          myString = myString.Replace(@"binding type", "BindingType")
        

        您可以在反序列化之前执行此步骤。

        文字也少了一点。虽然这在我的示例中有效,但在某些情况下可能无效。例如,如果“绑定类型”不仅是字段名称,而且是一段数据,则此方法会更改它以及字段名称,这可能是不可取的。

        【讨论】:

          【解决方案4】:

          如果要手动初始化Json,可以这样做:

          var jsonString = "{" +
                      "'name': 'Fubar'," +
                      "'.NET version': '4.0'," +
                      "'binding type': 'HTTP'," +
                      "}";
                  var json = JsonConvert.DeserializeObject(jsonString);            
                  return Ok(json);
          

          别忘了包含using Newtonsoft.Json;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多