我有以下 JSON,我正在尝试反序列化。
{
"output-parameters":[
{
"value":{
"array":{
"elements":[
{
"string":{
"value":"cp-100"
}
},
{
"string":{
"value":"cp-101"
}
},
{
"string":{
"value":"cp-100"
}
},
{
"string":{
"value":"cp-101"
}
},
{
"string":{
"value":"cp-100"
}
}
]
}
},
"type":"Array/string",
"name":"Tags",
"scope":"local"
},
{
"value":{
"string":{
"value":"subscribed"
}
},
"type":"string",
"name":"Error",
"scope":"local"
}
]
}
我创建了以下类来绑定 JSON
public class OutputParameter
{
[JsonProperty(PropertyName = "value")]
public value value { get; set; }
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
}
public class value
{
[JsonProperty(PropertyName = "array")]
public array_ array_ { get; set; }
}
public class array_
{
[JsonProperty(PropertyName = "elements")]
public element[] element { get; set; }
}
public class element
{
[JsonProperty(PropertyName = "value")]
public string value { get; set; }
}
反序列化时没有收到任何错误。我也可以轻松浏览。
但是当我尝试获取 element[n] 的值(output_parameters[0].value.array_.element[0].value)。它返回 null。
这里有什么问题?
注意:我只需要从 JSON 中获取一些值。例如我不需要像这样的值 “类型”:“字符串”, "名称":"错误", “范围”:“本地” 这就是我创建这样的 C# 类的原因。
您的类应该如下所示,因为
output-parameters
是一个数组[
,它可能包含更多值或列表,因此创建一个包含输出参数列表的Rootobject
。
现在
output-parameters
不仅包含value
和name
而且还包含。 type
和 scope
处于同一层次结构。
您没有名为
string
的节点的声明,此处称为 SomeString
和 SomeString1
您的类 Value 还包含
string
,此处表示为 SomeString1
public class Rootobject
{
[JsonProperty(PropertyName = "output-parameters")]
public List<OutputParameters> outputparameters { get; set; }
}
public class OutputParameters
{
[JsonProperty(PropertyName = "value")]
public SomeValue value { get; set; }
[JsonProperty(PropertyName = "type")]
public string type { get; set; }
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "scope")]
public string scope { get; set; }
}
public class SomeValue
{
[JsonProperty(PropertyName = "array")]
public SomeArray array { get; set; }
[JsonProperty(PropertyName = "string")]
public SomeString1 _string { get; set; }
}
public class SomeArray
{
[JsonProperty(PropertyName = "elements")]
public List<SomeElement> elements { get; set; }
}
public class SomeElement
{
[JsonProperty(PropertyName = "string")]
public SomeString _string { get; set; }
}
public class SomeString
{
[JsonProperty(PropertyName = "value")]
public string value { get; set; }
}
public class SomeString1
{
[JsonProperty(PropertyName = "value")]
public string value { get; set; }
}
然后你应该使用以下代码对其进行反序列化
Rootobject ro = JsonConvert.DeserializeObject<Rootobject>(jsonstr);
Console.WriteLine(ro.outputparameters[0].value.array.elements[0]._string.value);
显示值已被提取的屏幕截图
根据微软官方文档(https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/customize-properties?pivots=dotnet-8-0),“ Web 默认命名策略是驼峰式大小写。”
JsonSerializerOptions options = new(JsonSerializerDefaults.Web)
{
WriteIndented = true
};
在 .NET 8 中,可以指定 JSON 在序列化/反序列化时可以使用的命名策略
var test = new HttpResponseMessage
{
Content = JsonContent.Create(jsonBody, options: new JsonSerializerOptions { DictionaryKeyPolicy = JsonNamingPolicy.CamelCase }),
StatusCode = httpStatusCode
};