反序列化 JSON 返回 null C#

问题描述 投票:0回答:2

我有以下 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# 类的原因。

c# json json.net deserialization
2个回答
3
投票

您的类应该如下所示,因为

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);            

显示值已被提取的屏幕截图


0
投票

根据微软官方文档(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
};
© www.soinside.com 2019 - 2024. All rights reserved.