C# Newtonsoft JSON:反序列化和跳过对象名称

Posted

技术标签:

【中文标题】C# Newtonsoft JSON:反序列化和跳过对象名称【英文标题】:C# Newtonsoft JSON: deserialize & skip object name 【发布时间】:2020-09-06 02:04:21 【问题描述】:

我的 JSON 数据如下所示:

"AE":"amount":"0.00000000","value":"0.00000000",
"AR":"amount":"0.00000000","value":"0.00000000",
"BC":"amount":"0.09670332","value":"3.74814004"

还有一个看起来像这样的类:

internal class Balance 
    internal float amount;
    internal float value;

我正在尝试阅读:

private static List<Balance> Balances = new List<Balances>();
Balances = JsonConvert.DeserializeObject<List<Balance>>(json);

...但我对对象的名称(AE、AR、BC 等)并不感兴趣。我应该如何反序列化输入以丢弃这些名称或将它们填充到某个地方?

【问题讨论】:

【参考方案1】:

您可以解析 json 并遍历父属性。取余额并忽略属性名称。

var obj = JObject.Parse(json);
List<Balance> balances = new List<Balance>();
foreach (var item in obj.Properties())
    balances.Add(JsonConvert.DeserializeObject<Balance>(obj[item.Name].ToString()));

本质上,您正在获取父属性(AE、AR、BC)下的 json,并将 Balance 对象(通过反序列化)添加到您想要的列表中。

    obj[item.Name].ToString() 为您提供每个 AE、AR、BC 等的内部字符串 JsonConvert.Deserialize 将该字符串转换为您的 Balance 类 将对象添加到列表中以供您使用。

您的余额类问题

我注意到的另一件事是,您没有使用getter and setter。如果没有 getter 和 setter,您将无法获得任何值。

此外,命名约定规定变量名称以大写字母开头。您可以使用 JsonProperty 来定义 json 中的名称。

internal class Balance

    [JsonProperty("amount")]
    public float Amount  get; set; 
    [JsonProperty("value")]
    public float Value  get; set; 

【讨论】:

【参考方案2】:

您的 json 包含 Dictionary&lt;string, Balance&gt;

如果您只想提取所有值,请使用:

Balances = JsonConvert.DeserializeObject<Dictionary<string, Balance>>(json).Values.ToList();

这将反序列化为Dictionary&lt;string, Balance&gt;,然后使用您要查找的值获取List&lt;Balance&gt;

【讨论】:

以上是关于C# Newtonsoft JSON:反序列化和跳过对象名称的主要内容,如果未能解决你的问题,请参考以下文章

C# Newtonsoft.Json 解析多嵌套json 进行反序列化

C# Newtonsoft.Json 解析多嵌套json 进行反序列化

C#中使用Newtonsoft.Json序列化和反序列化自定义类对象

C# dynamic类型序列化和反序列化之Newtonsoft.Json,动态解析远端返回的jSON数据

c#开发中使用Newtonsoft.Json反序列化数组求解?

Newtonsoft JSON 反序列化