我正在创建一个C#WCF Web服务,它以JSON格式返回大量数据.客户端是一个iPad应用程序,目前正在由另一个团队开发,所以我正在研究规范,没有示例数据.
目前,JSON字符串是由.net框架创建的,我的Web服务返回一个C#对象,其中包含然后使用DataContracts由框架序列化的所有信息.
我的问题是通信规范只包含JSON Schema文件(基于http://json-schema.org/).为了便于开发,我想在C#中生成相应的类,但由于文件包含大量信息,而且有十几个文件,我真的不想手动创建这些类.
所以我正在寻找一种工具,可以让我:
我找到了许多工具来验证JSON模式的JSON字符串,或者从JSON字符串生成类,但似乎没有任何帮助我的东西.
有JSON.NET,但它似乎是一个库,而不是一个工具,我没有找到任何有关使用它生成类的信息.
所以,如果有人知道一个工具或者有关于如何生成这些类的想法(我尝试了一个用Java创建类但我无法使其工作的工具).
我正在尝试将内容发布到我的服务器。这就是我过去一直这样做的方式,直到我不得不使用字符串以外的对象为止。
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(authType, tokens);
var postParams = new Dictionary<string, object>();
postParams.Add("string", string);
postParams.Add("int", string);
postParams.Add("datetime", DateTime);
postParams.Add("datetime", DateTime);
postParams.Add("Match", Match);
postParams.Add("TicketId", token);
using (var postContent = new FormUrlEncodedContent(postParams.ToDictionary()))
{
var myContent = JsonConvert.SerializeObject(postParams);
var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
using (HttpResponseMessage response = await client.PostAsync(@"http://url/api", byteContent))
{
response.EnsureSuccessStatusCode(); // Throw if httpcode is an error
using (HttpContent content = response.Content)
{
string result = …
Run Code Online (Sandbox Code Playgroud) 有许多很好的方法可以从JSON自动生成C#代码,例如此处和此处.
但是,生成的代码不包含属性初始值设定项.例如,以下JSON:
{
"Name" : "Blastoise"
}
Run Code Online (Sandbox Code Playgroud)
得到反序列化:
public class RootObject
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
大概这是设计的,因为JSON中使用的值可能会被覆盖,所以添加初始化器可能会让那些不想要它们的人烦恼.
但如果我想要怎么办?如果没有手动手动添加每个值,有没有办法将JSON反序列化为以下内容?
public class RootObject
{
public string Name { get; set; } = "Blastoise";
}
Run Code Online (Sandbox Code Playgroud)
显然,在这种情况下,手动编辑很容易,但对于较大的JSON对象,手动编辑变得乏味.
我有这个简单的JSON,我正在反序列化这个JSON,所以我可以获得元素.这是我的JSON:
{
"QuestionIDs": [
"QID1",
"QID3"
],
"QuestionDefinitions": {
"Question1": {
"DETag": "Q1",
"Config": {
"QDescription": "UseText"
},
"COrder": [
"1",
"2",
"3"
],
"Validation": {
"Settings": {
"ForceResponse": "OFF",
"ForceResponseType": "ON",
"Type": "None"
}
}
}
},
"NextButton": null,
"PreviousButton": false
}
Run Code Online (Sandbox Code Playgroud)
这是我写的代码:
[DataContract]
public class RootObject
{
[DataMember]
public Dictionary<string, Dictionary<string, string>> QuestionDefinitions { get; set; }
[DataMember]
public List<string> QuestionIDs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
QuestionIDs
工作得很好.但是,QuestionDefinitions
不起作用.它说它是一个空序列.我不确定是什么问题.
我希望能够访问QuestionDefinitions
.
我试过了Json.Net
.面对同样的问题.我能够得到简单的元素.但是,无法访问QuestionDefinitions
. …
我正在尝试使用此对象创建一个List
类:
{
"801": {
"Name": "SomeWhere",
"Lanes": {
"2": {
"Ip": "172.23.101.21"
},
"4": {
"Ip": "172.23.101.41"
},
"6": {
"Ip": "172.23.101.61"
},
"8": {
"Ip": "172.23.101.81"
},
"9": {
"Ip": "172.23.101.91"
},
"11": {
"Ip": "172.23.101.111"
}
}
},
"803": {
"Name": "OverThere",
"Lanes": {
"3": {
"Ip": "172.23.103.31"
},
"6": {
"Ip": "172.23.103.61"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要它才能像这样使用它:List<ClassOfJson> jsonData = new List<ClassOfJson>();
我在 C# 中使用 Newtonsoft。我可以做什么来解决这个问题?