Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# 使用属性将JArray转换为对象_C#_Json - Fatal编程技术网

C# 使用属性将JArray转换为对象

C# 使用属性将JArray转换为对象,c#,json,C#,Json,我需要将下面的JArray转换为一个对象。 我的问题是,我需要用属性来实现这一点。 因为我无法更改解耦类中的以下调用: var message = JsonConvert.DeserializeObject(e.Message, messageType) JSON [71,[[77372266,1508067366000,-0.12144759,5517.4],[77372265,1508067366000,-0.020001,5518.2],[77372251,1508067362000,-

我需要将下面的JArray转换为一个对象。 我的问题是,我需要用属性来实现这一点。 因为我无法更改解耦类中的以下调用:

var message = JsonConvert.DeserializeObject(e.Message, messageType)
JSON

[71,[[77372266,1508067366000,-0.12144759,5517.4],[77372265,1508067366000,-0.020001,5518.2],[77372251,1508067362000,-0.01,5517.2],[77372235,1508067358000,0.020001,5517.8],[77372220,1508067352000,-0.41883579,5517.3],[77372218,1508067352000,-1.05740887,5517.2],[77372211,1508067351000,-1.8084,5517.2],[77372207,1508067350000,-0.01565918,5517.2],[77372206,1508067349000,-0.01721768,5514.3],[77372205,1508067349000,-0.10347625,5514.3],[77372201,1508067348000,-1.08183286,5513.1],[77372200,1508067348000,-0.04218858,5513.1],[77372199,1508067348000,-0.020001,5513.3],[77372198,1508067348000,-0.020001,5513.3],[77372197,1508067348000,-0.020001,5513.3],[77372196,1508067348000,-0.020001,5513.3],[77372195,1508067348000,-2.16396207,5513.3],[77372194,1508067348000,-1.5601,5513.5],[77372193,1508067348000,-0.13520397,5514.2],[77372192,1508067347000,-0.01479603,5514.2],[77372191,1508067347000,-0.13659854,5513.4],[77372189,1508067346000,-0.01597635,5513.3],[77372187,1508067346000,-0.19812221,5513.3],[77372184,1508067346000,-0.01261482,5513.3],[77372183,1508067346000,0.131033,5519.7],[77372182,1508067346000,0.2011,5519.4],[77372181,1508067346000,0.074337,5518.2],[77372180,1508067346000,0.125,5517.5],[77372179,1508067346000,0.06401,5516.5],[77372178,1508067346000,0.05305,5516.3]]]
我的课

public class Root 
{
    public int ChannelId { get; set; }

    public List<Item> Data { get; set; }

}

public class Item
{
    public int Id { get; set; }
    public long Timestamp { get; set; }

    public decimal Price { get; set; }
    public decimal Size { get; set; }
}
公共类根目录
{
公共int ChannelId{get;set;}
公共列表数据{get;set;}
}
公共类项目
{
公共int Id{get;set;}
公共长时间戳{get;set;}
公共十进制价格{get;set;}
公共十进制大小{get;set;}
}

首先将json解析为JArray,然后创建一个函数将其解析为您选择的对象。您可以尝试以下方法:

string json = "[71,[[77372266,1508067366000,-0.12144759,5517.4],[77372265,1508067366000,-0.020001,5518.2],[77372251,1508067362000,-0.01,5517.2],[77372235,1508067358000,0.020001,5517.8],[77372220,1508067352000,-0.41883579,5517.3],[77372218,1508067352000,-1.05740887,5517.2],[77372211,1508067351000,-1.8084,5517.2],[77372207,1508067350000,-0.01565918,5517.2],[77372206,1508067349000,-0.01721768,5514.3],[77372205,1508067349000,-0.10347625,5514.3],[77372201,1508067348000,-1.08183286,5513.1],[77372200,1508067348000,-0.04218858,5513.1],[77372199,1508067348000,-0.020001,5513.3],[77372198,1508067348000,-0.020001,5513.3],[77372197,1508067348000,-0.020001,5513.3],[77372196,1508067348000,-0.020001,5513.3],[77372195,1508067348000,-2.16396207,5513.3],[77372194,1508067348000,-1.5601,5513.5],[77372193,1508067348000,-0.13520397,5514.2],[77372192,1508067347000,-0.01479603,5514.2],[77372191,1508067347000,-0.13659854,5513.4],[77372189,1508067346000,-0.01597635,5513.3],[77372187,1508067346000,-0.19812221,5513.3],[77372184,1508067346000,-0.01261482,5513.3],[77372183,1508067346000,0.131033,5519.7],[77372182,1508067346000,0.2011,5519.4],[77372181,1508067346000,0.074337,5518.2],[77372180,1508067346000,0.125,5517.5],[77372179,1508067346000,0.06401,5516.5],[77372178,1508067346000,0.05305,5516.3]]]";

var array = JArray.Parse(json);

var channelId = array[0];
var listData = array[1].ToList();

Root root = new Root();
root.ChannelId = Convert.ToInt32(channelId);
root.Data = new List<Item>();
for (int i = 0; i < listData.Count; i++)
{
    Item newItem = new Item();
    var item = listData[i].ToList();

    newItem.Id = Convert.ToInt32(item[0]);
    newItem.Timestamp = Convert.ToInt64(item[1]);
    newItem.Price = Convert.ToDecimal(item[2]);
    newItem.Size = Convert.ToDecimal(item[3]);
    root.Data.Add(newItem);
}
string json=“[71,[[773722661508067366000,-0.121447595517.4],[773722651508067366000,-0.0200015518.2],[77372251508067362000,-0.015517.2],[773722351508067358000,0.0200015517.8],[7737222201508067352000,-.4188355795517.3],[773722181508067352000,-.057408875517.2],[773722115080351000,-.808417.2],[77372207,1508067350000,-0.01565918,5517.2],[77372206,1508067349000,-0.01721768,5514.3],[77372205,1508067349000,-0.10347625,5514.3],[77372201,1508067348000,-1.08183286,5513.1],[77372200,1508067348000,-0.04218858,5513.1],[77372199,1508067348000,-0.020001,5513.3],[77372198,1508067348000,-0.020001,5513.3],[77372197,1508067348000,-0.020001,5513.3],[77372196,1508067348000,-0.020001,5513.3],[77372195,1508067348000,-2.16396207,5513.3],[77372194,1508067348000,-1.5601,5513.5],[77372193,1508067348000,-0.13520397,5514.2],[77372192,1508067347000,-0.01479603,5514.2],[77372191,1508067347000,-0.13659854,5513.4],[77372189,1508067346000,-0.01597635,5513.3],[77372187,1508067346000,-0.19812221,5513.3],[77372184,1508067346000,-0.01261482,5513.3],[77372183,1508067346000,0.131033,5519.7],[77372182,1508067346000,0.2011,5519.4],[77372181,1508067346000,0.074337,5518.2],[77372180,1508067346000,0.125,5517.5],[77372179,1508067346000,0.06401,5516.5],[77372178,1508067346000,0.05305,5516.3]]]";
var array=JArray.Parse(json);
var channelId=数组[0];
var listData=array[1].ToList();
根=新根();
root.ChannelId=Convert.ToInt32(ChannelId);
root.Data=新列表();
for(int i=0;i
首先将json解析为JArray,然后创建一个函数将其解析为您选择的对象。您可以尝试以下方法:

string json = "[71,[[77372266,1508067366000,-0.12144759,5517.4],[77372265,1508067366000,-0.020001,5518.2],[77372251,1508067362000,-0.01,5517.2],[77372235,1508067358000,0.020001,5517.8],[77372220,1508067352000,-0.41883579,5517.3],[77372218,1508067352000,-1.05740887,5517.2],[77372211,1508067351000,-1.8084,5517.2],[77372207,1508067350000,-0.01565918,5517.2],[77372206,1508067349000,-0.01721768,5514.3],[77372205,1508067349000,-0.10347625,5514.3],[77372201,1508067348000,-1.08183286,5513.1],[77372200,1508067348000,-0.04218858,5513.1],[77372199,1508067348000,-0.020001,5513.3],[77372198,1508067348000,-0.020001,5513.3],[77372197,1508067348000,-0.020001,5513.3],[77372196,1508067348000,-0.020001,5513.3],[77372195,1508067348000,-2.16396207,5513.3],[77372194,1508067348000,-1.5601,5513.5],[77372193,1508067348000,-0.13520397,5514.2],[77372192,1508067347000,-0.01479603,5514.2],[77372191,1508067347000,-0.13659854,5513.4],[77372189,1508067346000,-0.01597635,5513.3],[77372187,1508067346000,-0.19812221,5513.3],[77372184,1508067346000,-0.01261482,5513.3],[77372183,1508067346000,0.131033,5519.7],[77372182,1508067346000,0.2011,5519.4],[77372181,1508067346000,0.074337,5518.2],[77372180,1508067346000,0.125,5517.5],[77372179,1508067346000,0.06401,5516.5],[77372178,1508067346000,0.05305,5516.3]]]";

var array = JArray.Parse(json);

var channelId = array[0];
var listData = array[1].ToList();

Root root = new Root();
root.ChannelId = Convert.ToInt32(channelId);
root.Data = new List<Item>();
for (int i = 0; i < listData.Count; i++)
{
    Item newItem = new Item();
    var item = listData[i].ToList();

    newItem.Id = Convert.ToInt32(item[0]);
    newItem.Timestamp = Convert.ToInt64(item[1]);
    newItem.Price = Convert.ToDecimal(item[2]);
    newItem.Size = Convert.ToDecimal(item[3]);
    root.Data.Add(newItem);
}
string json=“[71,[[773722661508067366000,-0.121447595517.4],[773722651508067366000,-0.0200015518.2],[77372251508067362000,-0.015517.2],[773722351508067358000,0.0200015517.8],[7737222201508067352000,-.4188355795517.3],[773722181508067352000,-.057408875517.2],[773722115080351000,-.808417.2],[77372207,1508067350000,-0.01565918,5517.2],[77372206,1508067349000,-0.01721768,5514.3],[77372205,1508067349000,-0.10347625,5514.3],[77372201,1508067348000,-1.08183286,5513.1],[77372200,1508067348000,-0.04218858,5513.1],[77372199,1508067348000,-0.020001,5513.3],[77372198,1508067348000,-0.020001,5513.3],[77372197,1508067348000,-0.020001,5513.3],[77372196,1508067348000,-0.020001,5513.3],[77372195,1508067348000,-2.16396207,5513.3],[77372194,1508067348000,-1.5601,5513.5],[77372193,1508067348000,-0.13520397,5514.2],[77372192,1508067347000,-0.01479603,5514.2],[77372191,1508067347000,-0.13659854,5513.4],[77372189,1508067346000,-0.01597635,5513.3],[77372187,1508067346000,-0.19812221,5513.3],[77372184,1508067346000,-0.01261482,5513.3],[77372183,1508067346000,0.131033,5519.7],[77372182,1508067346000,0.2011,5519.4],[77372181,1508067346000,0.074337,5518.2],[77372180,1508067346000,0.125,5517.5],[77372179,1508067346000,0.06401,5516.5],[77372178,1508067346000,0.05305,5516.3]]]";
var array=JArray.Parse(json);
var channelId=数组[0];
var listData=array[1].ToList();
根=新根();
root.ChannelId=Convert.ToInt32(ChannelId);
root.Data=新列表();
for(int i=0;i
如果使用(现在称为JSON.NET),则可以使用创建自己的自定义转换器

然后,您的类将类似于:

 public class MyCustomConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(Root).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo());
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartArray)
            {
                JArray rootToken = JArray.Load(reader);

                if (rootToken[0] != null && rootToken[1] != null)
                {
                    var root = new Root(rootToken[0].Value<int>(), this.readItems(rootToken[1]));
                    return root;
                }
            }

            return existingValue;
        }

        private IList<Item> readItems(JToken items)
        {
            var itemList = new List<Item>();
            if (items.Type == JTokenType.Array)
            {
                foreach(var item in items.Children())
                {
                    if (item.Type == JTokenType.Array && item.Count() == 4)
                    {
                        itemList.Add(new Item(
                            item[0].Value<int>(),
                            item[1].Value<long>(),
                            item[2].Value<decimal>(),
                            item[3].Value<decimal>()));
                    }
                }
            }

            return itemList;
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
如果使用(现在称为JSON.NET),则可以使用创建自己的自定义转换器

然后,您的类将类似于:

 public class MyCustomConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(Root).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo());
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartArray)
            {
                JArray rootToken = JArray.Load(reader);

                if (rootToken[0] != null && rootToken[1] != null)
                {
                    var root = new Root(rootToken[0].Value<int>(), this.readItems(rootToken[1]));
                    return root;
                }
            }

            return existingValue;
        }

        private IList<Item> readItems(JToken items)
        {
            var itemList = new List<Item>();
            if (items.Type == JTokenType.Array)
            {
                foreach(var item in items.Children())
                {
                    if (item.Type == JTokenType.Array && item.Count() == 4)
                    {
                        itemList.Add(new Item(
                            item[0].Value<int>(),
                            item[1].Value<long>(),
                            item[2].Value<decimal>(),
                            item[3].Value<decimal>()));
                    }
                }
            }

            return itemList;
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }

您的输入没有json格式吗?我已经重新格式化了示例。json在类之上。您的输入没有json格式吗?我已经重新格式化了示例。json在类之上。感谢您的帮助,但是如上所述,我需要使用属性,因为我无法更改反序列化调用。谢谢您的帮助,但是如上所述,我需要使用属性,因为我无法更改反序列化调用。