将JSON数据放入c#datatable

时间:2017-09-14 11:15:30

标签: c# json serialization

我正在尝试反序列化从API返回的一些JSON,以便我可以遍历一个县名数组并将信息添加到C#中的数据表中。但是,当我尝试反序列化时,我在第一个障碍时收到以下错误:

  

错误:System.MissingMethodException:没有为' DPDJSONLibrary.DPD_JSON + LOCR_Data []'的类型定义无参数构造函数。

API的提供者提供了JSON响应的示例,如下所示:

{
    "error": null,
    "data":[{
        "country": [{
            "countryCode":"GB",
            "countryName":"United Kingdom",
            "internalCode":"UK",
            "isEUCountry":false,
            "isLiabilityAllowed":false,
            "isoCode":"826",
            "isPostcodeRequired":false,
            "liabilityMax":15000
        }]
    }]
}

我从API中获取的JSON数据示例是:

{
    "data": {
        "country":[
            {
                "countryCode":"PM",
                "countryName":"St Pierre & Miquilon",
                "isoCode":"666",
                "isEUCountry":false,
                "isLiabilityAllowed":true,
                "liabilityMax":15000,
                "isPostcodeRequired":true
            },
            {
                "countryCode":"SR",
                "countryName":"Suriname",
                "isoCode":"740",
                "isEUCountry":false,
                "isLiabilityAllowed":true,
                "liabilityMax":15000,
                "isPostcodeRequired":true
            },
            {
                "countryCode":"SZ",
                "countryName":"Swaziland",
                "isoCode":"748",
                "isEUCountry":false,
                "isLiabilityAllowed":true,
                "liabilityMax":15000,
                "isPostcodeRequired":true
            }
        ]
    }
}

我试图制作一些类来将JSON放入如下:

/// <summary>
/// List Of Countries Response object.
/// </summary>
public class LOCR
{
    public LOCR_Error error { get; set; }
    public LOCR_Data[] data { get; set; }
}

public class LOCR_Error
{
    public string errorAction { get; set; }
    public string errorCode { get; set; }
    public string errorMessage { get; set; }
    public string errorObj { get; set; }
    public string errorType { get; set; }
}

public class LOCR_Data
{
    public LOCR_Data_Country[] country { get; set; }
}

public class LOCR_Data_Country
{
    public string countryCode { get; set; }
    public string countryName { get; set; }
    public string internalCode { get; set; }
    public bool isEUCountry { get; set; }
    public bool isLiabilityAllowed { get; set; }
    public string isoCode { get; set; }
    public bool isPostcodeRequired { get; set; }
    public int liabilityMax { get; set; }
}

当我将JSON作为字符串返回时,我正在尝试使用Newtonsoft(插件?)将其放入我的类中:

JavaScriptSerializer ser = new JavaScriptSerializer();
DPD_JSON.LOCR DPDCountries = new DPD_JSON.LOCR();
DPDCountries = ser.Deserialize<DPD_JSON.LOCR>(data);

上面的最后一行是生成错误。我怀疑我写错了我的课程,我试图将JSON反序列化 - 有人能看到我出错的地方吗?

3 个答案:

答案 0 :(得分:0)

Deserialize会返回一个列表,而不是一个数组,因此LOCR_Data_Country应该是List类型,而不是数组:

    public class LOCR_Data
    {
        public List<LOCR_Data_Country> country { get; set; }
    }

答案 1 :(得分:0)

您已经显示的两个示例JSON字符串之间存在巨大差异。主要是第一个是数组:"data":[ ... ],第二个是对象"data:{ ... }。这两个是不可互换的,所以你必须坚持其中任何一个。如果您从API返回的内容是对象,则应将模型重写为:

public class LOCR
{
    public LOCR_Error error { get; set; }
    // object here since "data": { ... }
    public LOCR_Data data { get; set; }
}

当您使用JSON进一步移动时,您可以看到LOCR_Data.country实际上是"country": [ ... ]两种情况下的数组,因此您可以坚持使用LOCR_Data类的当前实现。< / p>

答案 2 :(得分:0)

尝试使用:

dynamic data = Json.Decode(json);

请参阅此Using JsonConvert.DeserializeObject to deserialize Json

的答案

OR

{{1}}

您可以参考此Deserialize JSON into C# dynamic object?获取进一步的帮助