C#以非标准格式取消json的json

时间:2016-03-01 22:41:12

标签: c# json deserialization

我正在使用计算税收的网络服务。问题是我并不总是以完全相同的格式获取数据(参见下面的示例)。当我反序列化数据时,我的代码抛出异常。关于我可以做什么以允许反序列化处理单个元素或单个元素的数组的任何提示?仅供参考,除了税收之外,我还收到了更多的数据,但我只是展示税收部分以保持简单。

有时我会得到这样的数据:

{
    "data": {
        "tax": [{
            "amount": 0.00,
            "category": 0.0
        }]
    }
}

有时我会这样:

{
    "data": {
        "tax": {
            "amount": 336.01,
            "category": 0.0
        }
    }
}

这是我的班级:

public class Tax
{
    public float amount { get; set; }
    public float category{ get; set; }
}

我正在考虑添加[XmlIgnore]属性并手动取消确定以获取税务数据,但我希望尽可能远离它。

3 个答案:

答案 0 :(得分:0)

创建两个(或更多)不同的类,然后使用在解除分类时不会抛出异常的类。

看起来你可以使用这个类去除数组数据:

public class data
{
    public Dictionary<string, double> tax { get; set; }
}

如果该类成功反序列化,您可以手动或使用Reflection将其复制到税级。

答案 1 :(得分:0)

不确定XmlIgnore如何帮助您进行JSON序列化,但我建议使用Newtonsoft.Json将您的有效负载反序列化为JObject。然后,您可以使用Linq to JSON来调查结果,也可以根据&#34; tax&#34;的类型手动实例化您自己的对象。 property(JArray或JObject)

请参阅LINQ to JSON了解详情。

答案 2 :(得分:0)

我会使用JSON.Net (link to nuget)。然后我会从JObject方法获取JObject.Parse并检查相关的子元素是JObject还是JArray。然后,我将它转换为您的数据类(或动态类型)

dynamic taxData;
var json = JObject.Parse(response);
var rawTaxData = json["data"]["tax"];

if (rawTaxData is JObject)
{
    taxData = JsonConvert.DeserializeObject(rawTaxData);
}
else if (rawTaxData is JArray)
{
    var actualData = rawTaxData [0];
    taxData = JsonConvert.DeserializeObject(actualData);
}

另外,为了确保您的服务器实际返回数据而不是,例如,错误消息,请使用TryGetValue

JToken dataToken;
if (!json.TryGetValue("data", out dataToken))
{
    var rawTaxData = dataToken["tax"];
    // ...
}