【问题标题】:Parse a json fromVAT eu解析来自增值税欧盟的 json
【发布时间】:2016-09-05 21:50:41
【问题描述】:

我有这个 json:

"rates": {
        "AT": {
            "country": "Austria",
            "standard_rate": 20.00,
            "reduced_rate": 10.00,
            "reduced_rate_alt": 13.00,
            "super_reduced_rate": false,
            "parking_rate": 12.00
        },
        "BE": {
     ...

我尝试用这个类映射这个 json,但我遇到了一个问题,因为 json 的排列方式是一个标签是一个对象。我需要成为一个属性

public class Rate{
public string Tag { get; set; }
public string country { get; set; }
public double standard_rate { get; set; }
public double reduced_rate { get; set; }
public double reduced_rate_alt { get; set; }
public bool super_reduced_rate { get; set; }
public double parking_rate { get; set; }
}

我如何将它映射到一个单一的对象?提前致谢

【问题讨论】:

  • JSON 中的Tag 在哪里?
  • 我想要的标签等于'AT'或'BE'
  • AT 和 BE 的行为更像是字典中的键 - 查看结构:这些与其余数据无关。如果你必须让它成为一个属性,你需要编写你自己的转换器,我想。
  • 是 AT 和 BE 是字典的标识。我如何转换?我无法更改输出,因为是外部 Web 服务。

标签: c# json parsing c#-4.0


【解决方案1】:

如果您查看发布的(部分)JSON,您想要引用为 Tag 的内容与其余数据处于不同级别。忽略大括号并查看缩进。

它似乎是为了用作字典,并且很容易以这种方式反序列化。

{
"rates": {
    "AT": {
        "country": "Austria",
        "standard_rate": 20.00,
        "reduced_rate": 10.00,
        "reduced_rate_alt": 13.00,
        "super_reduced_rate": false,
        "parking_rate": 12.00
    },
    "BE": {
        "country": "Belguim",
    ...
    }
  }
}

课程:

public class VRates
{
    public Dictionary<string, VRate> rates { get; set; }
}

public class VRate
{
    public string country { get; set; }
    public float standard_rate { get; set; }
    public float reduced_rate { get; set; }
    public float reduced_rate_alt { get; set; }
    public bool super_reduced_rate { get; set; }
    public float parking_rate { get; set; }
}

使用它的代码(使用 JSON.NET):

string jstr = ... json from where ever
VRates rates = JsonConvert.DeserializeObject<VRates>(jstr);

您的“标签”将成为轻松查找的关键。如果你愿意,你可以摆脱外部类:

var rates = JsonConvert.DeserializeObject<VRates>(jstr).rates;

foreach (KeyValuePair<string, VRate> kvp in rates)
{
    Console.WriteLine("key: {0}, country: {1}", kvp.Key, kvp.Value.country);
}

输出:

键:AT,国家:奥地利
关键字:BE,国家:比利时

如果您真的想要 rate 类中的代码,可以将其复制到新属性,然后将字典值集合提取到 List&lt;VRate&gt; 或编写转换器来复制/移动它。

【讨论】:

  • 现在我遇到了 bool 和 double 的问题,如果 var 不是 double 则在 json 中返回 false。我尝试将 set 方法更改为: bool isDouble = Double.TryParse(value.ToString(), out _reduced_rate); if (isDouble) _reduced_rate = value;否则 _reduced_rate = 0.0;仍然会出现解析错误
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
相关资源
最近更新 更多