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<string, Balance>
。
如果您只想提取所有值,请使用:
Balances = JsonConvert.DeserializeObject<Dictionary<string, Balance>>(json).Values.ToList();
这将反序列化为Dictionary<string, Balance>
,然后使用您要查找的值获取List<Balance>
。
【讨论】:
以上是关于C# Newtonsoft JSON:反序列化和跳过对象名称的主要内容,如果未能解决你的问题,请参考以下文章
C# Newtonsoft.Json 解析多嵌套json 进行反序列化
C# Newtonsoft.Json 解析多嵌套json 进行反序列化
C#中使用Newtonsoft.Json序列化和反序列化自定义类对象
C# dynamic类型序列化和反序列化之Newtonsoft.Json,动态解析远端返回的jSON数据