Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用自定义类c从API反序列化响应#_C#_Asp.net_Json_C# 4.0 - Fatal编程技术网

C# 使用自定义类c从API反序列化响应#

C# 使用自定义类c从API反序列化响应#,c#,asp.net,json,c#-4.0,C#,Asp.net,Json,C# 4.0,我正在从一个api接收以下格式的json响应。我正在尝试将其与自定义类进行对应 { "TraceEvent": { "Attributes": { "Commodity": "APPLES", "Variety": "Green" }, "Codes": [{ "devicename": "", "code": "90149187

我正在从一个api接收以下格式的json响应。我正在尝试将其与自定义类进行对应

{
    "TraceEvent": {
        "Attributes": {
            "Commodity": "APPLES",
            "Variety": "Green"
        },
        "Codes": [{
                "devicename": "",
                "code": "901491877572115",
                "timestamp": "2018-02-15T19:33:29.4418926+05:30"
            }, {
                "devicename": "",
                "code": "6657287134488755",
                "timestamp": "2018-02-15T19:33:29.4418926+05:30"
            }
        ]
    }
}
下面是用于反序列化的自定义类

public class EventContainer
{
    [JsonProperty("TraceEvent")]
    public TraceEvent TraceEvent { get; set; }
} 

public class TraceEvent
{
    [JsonProperty("attributes")]
    public TraceAttributes Attributes { get; set; }
    [JsonProperty("codes")]
    public TraceCodes Codes { get; set; }
}

public class TraceAttributes
{
    [JsonProperty("commodity")]
    public string Commodity { get; set; }
    [JsonProperty("variety")]
    public string Variety { get; set; }
}

public class TraceCodes
{

    public TraceCodes()
    {
        Codes = new List<TraceCode>();
    }
    [JsonProperty("Codes")]
    public List<TraceCode> Codes { get; set; }
}

public class TraceCode
{
    [JsonProperty("devicename")]
    public string DeviceName { get; set; }
    [JsonProperty("code")]
    public string Code { get; set; }
    [JsonProperty("timestamp")]
    public DateTime Timestamp { get; set; }
}
公共类事件容器
{
[JsonProperty(“TraceeEvent”)]
公共跟踪事件跟踪事件{get;set;}
} 
公共类跟踪事件
{
[JsonProperty(“属性”)]
公共TraceAttributes属性{get;set;}
[JsonProperty(“代码”)]
公共跟踪代码{get;set;}
}
公共类TraceAttributes
{
[JsonProperty(“商品”)]
公共字符串商品{get;set;}
[JsonProperty(“品种”)]
公共字符串变体{get;set;}
}
公共类跟踪码
{
公共跟踪码()
{
代码=新列表();
}
[JsonProperty(“代码”)]
公共列表代码{get;set;}
}
公共类跟踪码
{
[JsonProperty(“devicename”)]
公共字符串DeviceName{get;set;}
[JsonProperty(“代码”)]
公共字符串代码{get;set;}
[JsonProperty(“时间戳”)]
公共日期时间时间戳{get;set;}
}
在接收器端,对于
代码
,我将得到null。请参考api接收器代码中的调试屏幕

有谁能告诉我如何重写我的自定义类以从JSON api反序列化代码列表吗


谢谢您的帮助。

TraceEvent
有一个属性

public TraceCodes Codes { get; set; }
TraceCodes
是另一个具有代码列表的对象:

public List<TraceCode> Codes { get; set; }
所以
“code”
部分是双重的。相反,您需要修改
TraceEvent
以直接获得该列表:

public class TraceEvent
{
    [JsonProperty("attributes")]
    public TraceAttributes Attributes { get; set; }

    [JsonProperty("Codes")]
    public List<TraceCode> Codes { get; set; }
}
公共类跟踪事件
{
[JsonProperty(“属性”)]
公共TraceAttributes属性{get;set;}
[JsonProperty(“代码”)]
公共列表代码{get;set;}
}

顺便说一句,这实际上应该会导致一个
JsonSerializationException
,因此您应该检查它是否在某个地方被吞没。

TraceEvent
有一个属性

public TraceCodes Codes { get; set; }
TraceCodes
是另一个具有代码列表的对象:

public List<TraceCode> Codes { get; set; }
所以
“code”
部分是双重的。相反,您需要修改
TraceEvent
以直接获得该列表:

public class TraceEvent
{
    [JsonProperty("attributes")]
    public TraceAttributes Attributes { get; set; }

    [JsonProperty("Codes")]
    public List<TraceCode> Codes { get; set; }
}
公共类跟踪事件
{
[JsonProperty(“属性”)]
公共TraceAttributes属性{get;set;}
[JsonProperty(“代码”)]
公共列表代码{get;set;}
}

顺便说一句,这实际上应该会导致一个
JsonSerializationException
,因此您应该检查它是否在某个地方被吞没。

更改类结构。代码应该在TraceeEvent类中,而不是在其自己的类中

public class TraceEvent
{
    [JsonProperty("attributes")]
    public TraceAttributes Attributes { get; set; }
    [JsonProperty("Codes")]
    public List<TraceCode> Codes { get; set; }
}
公共类跟踪事件
{
[JsonProperty(“属性”)]
公共TraceAttributes属性{get;set;}
[JsonProperty(“代码”)]
公共列表代码{get;set;}
}
下课

public class TraceCodes
{

    public TraceCodes()
    {
        Codes = new List<TraceCode>();
    }
    [JsonProperty("Codes")]
    public List<TraceCode> Codes { get; set; }
}
公共类跟踪代码
{
公共跟踪码()
{
代码=新列表();
}
[JsonProperty(“代码”)]
公共列表代码{get;set;}
}

更改类结构。代码应该在TraceeEvent类中,而不是在其自己的类中

public class TraceEvent
{
    [JsonProperty("attributes")]
    public TraceAttributes Attributes { get; set; }
    [JsonProperty("Codes")]
    public List<TraceCode> Codes { get; set; }
}
公共类跟踪事件
{
[JsonProperty(“属性”)]
公共TraceAttributes属性{get;set;}
[JsonProperty(“代码”)]
公共列表代码{get;set;}
}
下课

public class TraceCodes
{

    public TraceCodes()
    {
        Codes = new List<TraceCode>();
    }
    [JsonProperty("Codes")]
    public List<TraceCode> Codes { get; set; }
}
公共类跟踪代码
{
公共跟踪码()
{
代码=新列表();
}
[JsonProperty(“代码”)]
公共列表代码{get;set;}
}

如何反序列化?我觉得如果您使用asp.net mvc模型绑定,最好制作一个自定义modelbinder,如果您使用JSON.net进行反序列化,最好制作一个自定义jsonconverter。您提供了一个类,但它与
事件容器
有什么关系?什么?那句话毫无意义。请将类定义添加到您的问题中。TraceCodes应该列出您如何反序列化?我觉得如果您使用asp.net mvc模型绑定,您最好制作一个自定义modelbinder,如果您使用JSON.net进行反序列化,您最好制作一个自定义jsonconverter。您提供了一个类,但它与
EventContainer
有什么关系?什么?那句话毫无意义。请将类定义添加到您的问题中。TraceCodes应该列在他的屏幕截图中,他有
EventContainer
,但他没有发布定义。结果发现他有一个拼写错误。哦,好吧~–谢谢你的提醒john!在他的截图中,他有
EventContainer
,但他没有发布定义。结果他有一个打字错误。哦,好吧~–谢谢你的提醒john!