【发布时间】:2014-04-20 13:52:45
【问题描述】:
我正在编写一个读取 JSON 文件的工具。我正在使用 NewtonSoft 工具将 JSOn 反序列化为 C# 类。这是一个示例片段:
"name": "Fubar",
".NET version": "4.0",
"binding type": "HTTP",
字段名称包含在 C# 标识符中无效的空格和其他字符(.)。 这样做的正确方法是什么?
(很遗憾,我没有更改 JSON 格式的选项。)
【问题讨论】:
我正在编写一个读取 JSON 文件的工具。我正在使用 NewtonSoft 工具将 JSOn 反序列化为 C# 类。这是一个示例片段:
"name": "Fubar",
".NET version": "4.0",
"binding type": "HTTP",
字段名称包含在 C# 标识符中无效的空格和其他字符(.)。 这样做的正确方法是什么?
(很遗憾,我没有更改 JSON 格式的选项。)
【问题讨论】:
使用JsonProperty 属性来指示JSON 中的名称。例如
[JsonProperty(PropertyName = "binding type")]
public string BindingType { get; set; }
【讨论】:
如果您使用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);
【讨论】:
不知道为什么,但这对我不起作用。在这个例子中,我每次都简单地为“BindingType”返回一个空值。实际上,我发现将 Json 结果下载为字符串然后执行以下操作要容易得多:
myString = myString.Replace(@"binding type", "BindingType")
您可以在反序列化之前执行此步骤。
文字也少了一点。虽然这在我的示例中有效,但在某些情况下可能无效。例如,如果“绑定类型”不仅是字段名称,而且是一段数据,则此方法会更改它以及字段名称,这可能是不可取的。
【讨论】:
如果要手动初始化Json,可以这样做:
var jsonString = "{" +
"'name': 'Fubar'," +
"'.NET version': '4.0'," +
"'binding type': 'HTTP'," +
"}";
var json = JsonConvert.DeserializeObject(jsonString);
return Ok(json);
别忘了包含using Newtonsoft.Json;
【讨论】: