【问题标题】:C# Newtonsoft JSON: deserialize & skip object nameC# Newtonsoft JSON:反序列化和跳过对象名称
【发布时间】: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 等)并不感兴趣。我应该如何反序列化输入以丢弃这些名称或将它们填充到某个地方?

【问题讨论】:

    标签: c# json parsing


    【解决方案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 对象(通过反序列化)添加到您想要的列表中。

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

    您的余额类问题

    我注意到的另一件事是,您没有使用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;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多