使用自定义类c#

时间:2018-02-16 09:23:14

标签: c# asp.net json c#-4.0

我从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; }
}

在接收方,我为Codes获取空值。 Plesae在api接收器代码中引用我的调试屏幕,

enter image description here

任何人都可以告诉我如何重写我的自定义类以从JSON api反序列化代码列表

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

更改课程结构。代码应该在TraceEvent类中而不是在它自己的类

public class TraceEvent
{
    [JsonProperty("attributes")]
    public TraceAttributes Attributes { get; set; }
    [JsonProperty("Codes")]
    public List<TraceCode> Codes { get; set; }
}

删除下面的课程

public class TraceCodes
{

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

答案 1 :(得分:2)

TraceEvent有一个属性

public TraceCodes Codes { get; set; }

TraceCodes是另一个带有代码列表的对象:

public List<TraceCode> Codes { get; set; }

这意味着必须有这样的结构:

{
    "TraceEvent": {
        "Codes": {
            "Codes": [
                { … },
                { … },
            }
        }
    }
}

所以"Codes"部分是双倍的。相反,您需要修改TraceEvent以直接拥有该列表:

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

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

顺便说一下。应该实际上导致JsonSerializationException,所以你应该检查是否会被某个地方吞噬。