C#以非标准格式反序列化json

C#以非标准格式反序列化json,c#,json,deserialization,C#,Json,Deserialization,我正在使用一个计算税收的web服务。问题是我并不总是以完全相同的格式返回数据(参见下面的示例)。当我反序列化数据时,我的代码抛出一个异常。关于如何允许反序列化处理单个元素或单个元素数组的技巧?仅供参考,除了税收之外,我还得到了更多的数据,但我只是展示税收部分以保持简单 有时我会得到这样的数据: { "data": { "tax": [{ "amount": 0.00, "category": 0.0 }]

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

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

{
    "data": {
        "tax": [{
            "amount": 0.00,
            "category": 0.0
        }]
    }
}
{
    "data": {
        "tax": {
            "amount": 336.01,
            "category": 0.0
        }
    }
}
有时我会这样理解:

{
    "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]属性并手动反序列化以获取税务数据,但如果可能的话,我不想这样做。

创建两个(或更多)不同的类,然后使用反序列化时不会引发异常的类

看起来您可以使用以下类反序列化数组数据:

public class data
{
    public Dictionary<string, double> tax { get; set; }
}
公共类数据
{
公共字典税{get;set;}
}

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

不确定XmlIgnore对JSON序列化有何帮助,但我建议使用Newtonsoft.JSON将有效负载反序列化到JObject。然后,您可以使用LINQtoJSON来调查结果,也许还可以根据“tax”属性(JArray或JObject)的类型手动实例化您自己的对象

有关更多信息,请参阅。

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

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

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

这里:第一个是税数组,后一个是单个项目。快速简便的方法是使用试抓块。如果一个序列化方法失败,请使用第二个序列化方法。顺便问一下,你用什么API来计算税收(我也在找一个)?另外,千万不要把钱放在浮动或双变量中。浮点数据类型不是为了钱。使用此选项:与其使用异常来切换您拥有的数据的形式,不如在字符串中搜索表示数组的括号“[”。顺便说一句:最好的解决方案是让服务返回数据的格式保持一致。