C# “一个”中是什么;“对象”;从使用DataContractJsonSerializer的反序列化JSON文件?
我在文档或相关问题中找不到任何内容 我正在尝试反序列化以下json文件(tile\u config.json): 键“fg”可以是整数或对象数组,如示例中所示 我尝试使用以下代码反序列化: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
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;
}
}
}
}