Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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# “一个”中是什么;“对象”;从使用DataContractJsonSerializer的反序列化JSON文件?_C#_Datacontractjsonserializer - Fatal编程技术网

C# “一个”中是什么;“对象”;从使用DataContractJsonSerializer的反序列化JSON文件?

C# “一个”中是什么;“对象”;从使用DataContractJsonSerializer的反序列化JSON文件?,c#,datacontractjsonserializer,C#,Datacontractjsonserializer,我在文档或相关问题中找不到任何内容 我正在尝试反序列化以下json文件(tile\u config.json): 键“fg”可以是整数或对象数组,如示例中所示 我尝试使用以下代码反序列化: using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; namespace JSONTest { clas

我在文档或相关问题中找不到任何内容

我正在尝试反序列化以下json文件(tile\u config.json):

键“fg”可以是整数或对象数组,如示例中所示

我尝试使用以下代码反序列化:

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace JSONTest
{
    class Program
    {
        static void Main(string[] args)
        {
            load_json();
        }


        public static void load_json()
        {
            var ser = new DataContractJsonSerializer(typeof(TileConfig));
            System.IO.FileStream file =
                new System.IO.FileStream(".\\tile_config.json", System.IO.FileMode.Open);
            var tileconfig = (TileConfig)ser.ReadObject(file);
            file.Close();


            var Tile0 = tileconfig.tiles_new[0].tiles[0];
            Console.WriteLine(Tile0.id);
            //Output: t_dirt
            Console.WriteLine(Tile0.fg);
            //Output: System.Object[]
            Console.WriteLine(((Object[])Tile0.fg)[0]);
            //Output: System.Object

            //This doesn't work => InvalidCastException
            // var try1 = (JSON_Loader.TileConfig.TileValues.TileIndex)((Object[])tileconfig.tiles_new[0].tiles[0].fg)[0];

            //This doesn't work either => InvalidCastException
            //var try2 = ((Dictionary<object,object>)tileconfig.tiles_new[0].tiles[0].fg);
            //var try3 = ((Dictionary<string, object>)tileconfig.tiles_new[0].tiles[0].fg);

            //For the second one this works
            var Tile1 = tileconfig.tiles_new[0].tiles[1];
            Console.WriteLine(Tile1.id);
            //Output: t_fence_rope
            Console.WriteLine(Tile1.fg);
            //Output: 2016
            var try4 = ((int)Tile1.fg);
            Console.WriteLine(try4);
            //Output: 2016

            Console.ReadLine();
        }
    }

    [DataContract]
    public class TileConfig
    {
        [DataMember(Order = 0)]
        public List<TileInfo> tile_info;
        [DataMember(Name = "tiles-new", Order = 1)]
        public List<TileValues> tiles_new;

        [DataContract]
        public class TileInfo
        {
            [DataMember(EmitDefaultValue = false, Order = 0)]
            public int height;
            [DataMember(EmitDefaultValue = false, Order = 1)]
            public int width;
        }

        [DataContract]
        public class TileValues
        {
            [DataMember(EmitDefaultValue = false, Order = 0)]
            public string file;
            [DataMember(EmitDefaultValue = false, Order = 5)]
            public Tile[] tiles;

            [DataContract]
            public class Tile
            {
                [DataMember(EmitDefaultValue = false, Order = 0)]
                public string id;
                [DataMember(EmitDefaultValue = false, Order = 1)]
                public Object fg;
                [DataMember(EmitDefaultValue = false, Order = 2)]
                public int bg;
                [DataMember(EmitDefaultValue = false, Order = 3)]
                bool rotates;
            }

            [DataContract]
            public class TileIndex
            {
                [DataMember(EmitDefaultValue = false, Order = 0)]
                public int weight;
                [DataMember(EmitDefaultValue = false, Order = 1)]
                public int[] sprite;
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Runtime.Serialization;
使用System.Runtime.Serialization.Json;
名称空间JSONTest
{
班级计划
{
静态void Main(字符串[]参数)
{
加载_json();
}
公共静态无效加载_json()
{
var ser=新的DataContractJsonSerializer(typeof(TileConfig));
System.IO.FileStream文件=
新的System.IO.FileStream(“.\\tile\u config.json”,System.IO.FileMode.Open);
var tileconfig=(tileconfig)ser.ReadObject(文件);
file.Close();
var Tile0=tileconfig.tiles_new[0]。tiles[0];
控制台写入线(Tile0.id);
//输出:t_污垢
控制台写入线(Tile0.fg);
//输出:System.Object[]
Console.WriteLine(((Object[])Tile0.fg[0]);
//输出:System.Object
//这不起作用=>InvalidCastException
//var try1=(JSON_Loader.TileConfig.TileValues.TileIndex)((对象[])TileConfig.tiles_new[0].tiles[0].fg[0];
//这也不起作用=>InvalidCastException
//var try2=((Dictionary)tileconfig.tiles\u new[0].tiles[0].fg);
//var try3=((字典)tileconfig.tiles\u new[0].tiles[0].fg);
//对于第二个,这是有效的
var Tile1=tileconfig.tiles\u new[0]。tiles[1];
控制台写入线(Tile1.id);
//输出:t_围栏_绳索
控制台写入线(Tile1.fg);
//产出:2016年
var try4=((int)Tile1.fg);
控制台写入线(try4);
//产出:2016年
Console.ReadLine();
}
}
[数据合同]
公共类TileConfig
{
[数据成员(订单=0)]
公共列表信息;
[数据成员(Name=“tiles new”,订单=1)]
公开名单(新);;
[数据合同]
公共类TileInfo
{
[DataMember(EmitDefaultValue=false,Order=0)]
公众内部高度;
[DataMember(EmitDefaultValue=false,Order=1)]
公共整数宽度;
}
[数据合同]
公共类TileValue
{
[DataMember(EmitDefaultValue=false,Order=0)]
公共字符串文件;
[DataMember(EmitDefaultValue=false,Order=5)]
公共瓷砖[]瓷砖;
[数据合同]
公共级瓷砖
{
[DataMember(EmitDefaultValue=false,Order=0)]
公共字符串id;
[DataMember(EmitDefaultValue=false,Order=1)]
公共物体fg;
[DataMember(EmitDefaultValue=false,Order=2)]
公共int bg;
[DataMember(EmitDefaultValue=false,Order=3)]
布尔旋转;
}
[数据合同]
公共类TileIndex
{
[DataMember(EmitDefaultValue=false,Order=0)]
公共权重;
[DataMember(EmitDefaultValue=false,Order=1)]
公共int[]精灵;
}
}
}
}
如您所见,我试图通过将fg声明为Object来解决这个问题。这部分起作用。文件被反序列化没有问题。但是我没有办法(我还没有找到办法)获得“fg”的数据。我试着将它转换成字典,转换成TileIndex(我猜这就是其中的内容),我试着将它转换成字符串,但这不起作用,或者我不知道如何使它在这种情况下工作


现在我猜fg被设置为某个值,因为它不是null,而ToString返回System.Object。我的问题是DataContractJsonSerializer在这个对象中使用并存储了什么类型?

如果可以使用DataContractJsonSerializer来处理这种情况,我会感到惊讶。您可能应该改用Json.NET是的,我知道还有其他解决方案,我会尝试,但我仍然想知道这里到底发生了什么。数据是存储在某个地方,还是只是一个空对象,DataContractJsonSerializer会无声地删除数据?
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace JSONTest
{
    class Program
    {
        static void Main(string[] args)
        {
            load_json();
        }


        public static void load_json()
        {
            var ser = new DataContractJsonSerializer(typeof(TileConfig));
            System.IO.FileStream file =
                new System.IO.FileStream(".\\tile_config.json", System.IO.FileMode.Open);
            var tileconfig = (TileConfig)ser.ReadObject(file);
            file.Close();


            var Tile0 = tileconfig.tiles_new[0].tiles[0];
            Console.WriteLine(Tile0.id);
            //Output: t_dirt
            Console.WriteLine(Tile0.fg);
            //Output: System.Object[]
            Console.WriteLine(((Object[])Tile0.fg)[0]);
            //Output: System.Object

            //This doesn't work => InvalidCastException
            // var try1 = (JSON_Loader.TileConfig.TileValues.TileIndex)((Object[])tileconfig.tiles_new[0].tiles[0].fg)[0];

            //This doesn't work either => InvalidCastException
            //var try2 = ((Dictionary<object,object>)tileconfig.tiles_new[0].tiles[0].fg);
            //var try3 = ((Dictionary<string, object>)tileconfig.tiles_new[0].tiles[0].fg);

            //For the second one this works
            var Tile1 = tileconfig.tiles_new[0].tiles[1];
            Console.WriteLine(Tile1.id);
            //Output: t_fence_rope
            Console.WriteLine(Tile1.fg);
            //Output: 2016
            var try4 = ((int)Tile1.fg);
            Console.WriteLine(try4);
            //Output: 2016

            Console.ReadLine();
        }
    }

    [DataContract]
    public class TileConfig
    {
        [DataMember(Order = 0)]
        public List<TileInfo> tile_info;
        [DataMember(Name = "tiles-new", Order = 1)]
        public List<TileValues> tiles_new;

        [DataContract]
        public class TileInfo
        {
            [DataMember(EmitDefaultValue = false, Order = 0)]
            public int height;
            [DataMember(EmitDefaultValue = false, Order = 1)]
            public int width;
        }

        [DataContract]
        public class TileValues
        {
            [DataMember(EmitDefaultValue = false, Order = 0)]
            public string file;
            [DataMember(EmitDefaultValue = false, Order = 5)]
            public Tile[] tiles;

            [DataContract]
            public class Tile
            {
                [DataMember(EmitDefaultValue = false, Order = 0)]
                public string id;
                [DataMember(EmitDefaultValue = false, Order = 1)]
                public Object fg;
                [DataMember(EmitDefaultValue = false, Order = 2)]
                public int bg;
                [DataMember(EmitDefaultValue = false, Order = 3)]
                bool rotates;
            }

            [DataContract]
            public class TileIndex
            {
                [DataMember(EmitDefaultValue = false, Order = 0)]
                public int weight;
                [DataMember(EmitDefaultValue = false, Order = 1)]
                public int[] sprite;
            }
        }
    }
}