C# JSON对象显示为Null。为什么?
这是类数据库:C# JSON对象显示为Null。为什么?,c#,json,C#,Json,这是类数据库: namespace vVvBot.Model { public class Database { public List<CustomCommand> CustomCommands { get; set; } public List<CustomEvent> CustomEvents { get; set; } } } private Database _database; public Datab
namespace vVvBot.Model
{
public class Database
{
public List<CustomCommand> CustomCommands { get; set; }
public List<CustomEvent> CustomEvents { get; set; }
}
}
private Database _database;
public Database Database => _database ?? (_database = JsonContext.ReadToObject("Commands.txt"));
这是我反序列化和序列化数据库对象的类
namespace vVvBot.Data
{
public class FileJsonContext
{
public Database ReadToObject(string fileName)
{
dynamic jsonData = File.ReadAllText(fileName);
return JsonConvert.DeserializeObject<Database>(jsonData) ?? new Database();
}
public void ObjectToFile(string fileName, Database database)
{
dynamic jsonData = JsonConvert.SerializeObject(database, Formatting.Indented);
File.WriteAllText(fileName, jsonData);
}
}
}
这一问题的核心是:
var messageindex = Database.CustomEvents[index].Commands.FindLastIndex(x => x.Type == CommandType.Welcome);
它试图完成该行,但立即返回,因为返回时为null。自定义事件中有一个列表,它应该调用customcommand列表,以便我可以访问该对象。不知道为什么它会返回NULL
Json文件包括:
{
"CustomCommands": [
{
"Keyword": "Hello",
"Type": 0,
"Message": "World",
"Enabled": true
},
{
"Keyword": "Test",
"Type": 0,
"Message": "test",
"Enabled": true
},
{
"Keyword": "greeting",
"Type": 3,
"Message": "this isnt a test ",
"Enabled": true
},
{
"Keyword": "leaving",
"Type": 4,
"Message": "Sorry to see you go ",
"Enabled": true
},
{
"Keyword": "faq",
"Type": 1,
"Message": "This is a FAQ TEST ",
"Enabled": true
},
{
"Keyword": "Hi",
"Type": 0,
"Message": "Hilo ",
"Enabled": false
},
{
"Keyword": "Hi",
"Type": 0,
"Message": "Hilo ",
"Enabled": false
}
],
"CustomEvents": [
{
"Name": "greeting",
"Enabled": true
},
{
"Name": "leaving",
"Enabled": true
}
]
}
我很久以前就遇到过这个问题,我认为这个问题来自Unicode。 所以我为此写了一个函数。您可以使用它:
List<T> ToJson<T>(byte[] byteArray) where T : new()
{
MemoryStream stream = new MemoryStream(byteArray);
JsonSerializer se = new JsonSerializer();
StreamReader re = new StreamReader(stream);
JsonTextReader reader = new JsonTextReader(re);
return se.Deserialize<List<T>>(reader);
}
列出ToJson(byte[]byteArray),其中T:new()
{
MemoryStream stream=新的MemoryStream(byteArray);
JsonSerializer se=新的JsonSerializer();
StreamReader re=新的StreamReader(流);
JsonTextReader reader=新的JsonTextReader(re);
返回se.反序列化(读取器);
}
我是这样使用这个函数的:
ToJson(data.ToArray())
数据是一个MemoryStream。在您共享的JSON字符串中,“CustomEvents”的项没有设置属性“Commands”。因此,反序列化时,所有自定义事件都不会包含命令。它将是空列表,所以当您查询空列表时,您将始终得到NULL。它不是从CustomCommand中提取所有项目吗?当在CustomEvents类@ChetanRanpariya中调用它时,我想使用CustomCommands中已经存在的值,但它不是这样工作的。。。。JSON反序列化不会基于其他属性初始化属性。它是基于JSON字符串中的值来实现的。这里的
数据库
对象将有CustomCommands
和CustomEvents
属性值,但是CustomEvents
的项目在CustomCommands
属性中没有值。我很好奇,这如何解决属性数据不在属性中时属性未初始化的问题JSON字符串。还是我根本不理解这个问题?
{
"CustomCommands": [
{
"Keyword": "Hello",
"Type": 0,
"Message": "World",
"Enabled": true
},
{
"Keyword": "Test",
"Type": 0,
"Message": "test",
"Enabled": true
},
{
"Keyword": "greeting",
"Type": 3,
"Message": "this isnt a test ",
"Enabled": true
},
{
"Keyword": "leaving",
"Type": 4,
"Message": "Sorry to see you go ",
"Enabled": true
},
{
"Keyword": "faq",
"Type": 1,
"Message": "This is a FAQ TEST ",
"Enabled": true
},
{
"Keyword": "Hi",
"Type": 0,
"Message": "Hilo ",
"Enabled": false
},
{
"Keyword": "Hi",
"Type": 0,
"Message": "Hilo ",
"Enabled": false
}
],
"CustomEvents": [
{
"Name": "greeting",
"Enabled": true
},
{
"Name": "leaving",
"Enabled": true
}
]
}
List<T> ToJson<T>(byte[] byteArray) where T : new()
{
MemoryStream stream = new MemoryStream(byteArray);
JsonSerializer se = new JsonSerializer();
StreamReader re = new StreamReader(stream);
JsonTextReader reader = new JsonTextReader(re);
return se.Deserialize<List<T>>(reader);
}