从JSON.NET到C#对象
我试图在windows窗体中使用JSON.NET framework从JSON字符串中读取一些信息。但是我正在努力从“分类->主题”数组和“集群”中获取字典从JSON.NET到C#对象,c#,.net,json,json.net,C#,.net,Json,Json.net,我试图在windows窗体中使用JSON.NET framework从JSON字符串中读取一些信息。但是我正在努力从“分类->主题”数组和“集群”中获取字典 { "keywords": { "anyString": [ ], "allString": { "a5349f533e3aa3ccbc27de2638da38d6": "olympics" }, "exactString":
{
"keywords": {
"anyString": [
],
"allString": {
"a5349f533e3aa3ccbc27de2638da38d6": "olympics"
},
"exactString": [
],
"notString": [
],
"highlightString": [
]
},
"dates": {
"startDate": "15-01-2008",
"endDate": "15-09-2009",
"useDates": true
},
"clusters": {
"permission": {
"1": "private\/n"
}
},
"taxonomies": {
"Topics": {
"2488": "Olympics 2012 (not participation)",
"8876": "Olympics and culture"
},
"Keywords": {
"8848": "Engineering in the Olympics"
}
},
"sort": {
"sortId": 1,
"sortType": 2,
"sort": "datetime",
"sortOrder": "descending"
}
}
通过下面的代码,我已经能够阅读一些信息
JObject searchCriteria = JObject.Parse(contentSearchCriteria);
//search criteria
IEnumerable<string> allString = searchCriteria["keywords"]["allString"].Children().Values<string>();
IEnumerable<string> anyString = searchCriteria["keywords"]["anyString"].Children().Values<string>();
IEnumerable<string> notString = searchCriteria["keywords"]["notString"].Children().Values<string>();
IEnumerable<string> exactString = searchCriteria["keywords"]["exactString"].Children().Values<string>();
IEnumerable<string> highlightString = searchCriteria["keywords"]["highlightString"].Children().Values<string>();
//dates
string startDate = (string)searchCriteria["dates"]["startDate"];
string endDate = (string)searchCriteria["dates"]["endDate"];
bool useDates = (bool)searchCriteria["dates"]["useDates"];
//sort
int sortId = (int)searchCriteria["sort"]["sortId"];
int sortType = (int)searchCriteria["sort"]["sortType"];
string sort = (string)searchCriteria["sort"]["sort"];
string sortOrder = (string)searchCriteria["sort"]["sortOrder"];
更新2:
根据建议,我删除了所有额外的列表,并将类简化为:
class SearchMasterSearchCriteria
{
public SMKeywords keywords { get; set; }
public SMDates dates { get; set; }
public Dictionary<string, Dictionary<int, string>> clusters { get; set; }
public Dictionary<string, Dictionary<int, string>> taxonomies { get; set; }
public SMSort sort { get; set; }
}
class SMKeywords
{
public Dictionary<string, string> anyString {get; set;}
public Dictionary<string, string> allString { get; set; }
public Dictionary<string, string> exactString { get; set; }
public Dictionary<string, string> notString { get; set; }
public Dictionary<string, string> highlightString { get; set; }
}
class SMDates
{
public string startDate { get; set; }
public string endDate { get; set; }
public bool useDates { get; set; }
}
class SMSort
{
public int sortId { get; set; }
public int sortType { get; set; }
public string sort { get; set; }
public string sortOrder { get; set; }
}
class SearchMasterSearchCriteria
{
公共关键字{get;set;}
公共日期{get;set;}
公共字典群集{get;set;}
公共词典分类{get;set;}
公共SMSort排序{get;set;}
}
类关键字
{
公共字典anyString{get;set;}
公共字典allString{get;set;}
公共字典exactString{get;set;}
公共字典notString{get;set;}
公共字典highlightString{get;set;}
}
类SMDates
{
公共字符串startDate{get;set;}
公共字符串endDate{get;set;}
公共bool useDates{get;set;}
}
类SMSort
{
public int sortId{get;set;}
public int sortType{get;set;}
公共字符串排序{get;set;}
公共字符串排序器{get;set;}
}
我还添加了测试代码来序列化对象,如下所示:
//criteria
SearchMasterSearchCriteria smCriteria = new SearchMasterSearchCriteria();
//keywords
SMKeywords smKeywords = new SMKeywords(); ;
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("a5349f533e3aa3ccbc27de2638da38d6", "olympics");
dict.Add("9cfa7aefcc61936b70aaec6729329eda", "games");
smKeywords.allString = dict;
//category
Dictionary<int, string> categorieDict = new Dictionary<int, string>();
categorieDict.Add(2488, "Olympics 2012 (not participation)");
categorieDict.Add(8876, "Olympics and culture");
//taxonomies
Dictionary<string, Dictionary<int, string>> taxonomiesDict = new Dictionary<string, Dictionary<int, string>>();
taxonomiesDict.Add("Topics", categorieDict);
//metadata
Dictionary<int, string> metadataDict = new Dictionary<int, string>();
metadataDict.Add(1, @"private/n");
//clusters
Dictionary<string, Dictionary<int, string>> clustersDict = new Dictionary<string, Dictionary<int, string>>();
clustersDict.Add("permission", metadataDict);
//dates
SMDates smDates = new SMDates();
smDates.startDate = "15-01-2008";
smDates.endDate = "15-09-2009";
smDates.useDates = true;
//sort
SMSort smSort = new SMSort();
smSort.sortId = 1;
smSort.sortType = 2;
smSort.sort = "datetime";
smSort.sortOrder = "descending";
//add to criteria.
smCriteria.keywords = smKeywords;
smCriteria.clusters = clustersDict;
smCriteria.taxonomies = taxonomiesDict;
smCriteria.dates = smDates;
smCriteria.sort = smSort;
//serialize
string json = JsonConvert.SerializeObject(smCriteria);
var mydata1 = JsonConvert.DeserializeObject<SearchMasterSearchCriteria>(json);
//标准
SearchMasterSearchCriteria smCriteria=新的SearchMasterSearchCriteria();
//关键词
SMKeywords SMKeywords=新的SMKeywords();
Dictionary dict=新字典();
添加(“a5349f533e3aa3ccbc27de2638da38d6”,“奥运会”);
添加(“9cfa7aefcc61936b70aaec6729329eda”,“游戏”);
smKeywords.allString=dict;
//类别
字典分类法令=新字典();
分类法令增补(2488,“2012年奥运会(非参与)”;
分类法令增补(8876,“奥林匹克与文化”);
//分类法
字典分类dict=新字典();
添加(“主题”,分类法令);
//元数据
Dictionary metadataDict=新字典();
metadataDict.添加(1,@“专用/n”);
//簇
Dictionary clustersDict=新字典();
添加(“权限”,metadataDict);
//日期
SMDates SMDates=新SMDates();
smDates.startDate=“15-01-2008”;
smDates.endDate=“15-09-2009”;
smDates.useDates=true;
//分类
SMSort SMSort=新SMSort();
smSort.sortId=1;
smSort.sortType=2;
smSort.sort=“datetime”;
smSort.sortOrder=“下行”;
//添加到标准中。
smCriteria.keywords=smKeywords;
smCriteria.clusters=clustersDict;
smCriteria.taxonomies=分类法词典;
smCriteria.dates=smDates;
smCriteria.sort=smSort;
//连载
字符串json=JsonConvert.SerializeObject(smCriteria);
var mydata1=JsonConvert.DeserializeObject(json);
到那时,两个json字符串之间的唯一区别是。anyString、exactString等的[]和null。因此,我将空方括号替换为卷曲方括号,并将其取消序列化,没有错误:)
contentSearchCriteria=contentSearchCriteria.Replace(“[]”,“{}”);
var mydata=JsonConvert.DeserializeObject(contentSearchCriteria);
老实说,我根本不会像你这样做。以下是我检索数据的方法:
class Data {
Dictionary<string, Dictionary<string, string>> keywords;
DatesClass dates;
.......
}
class DatesClass
{
string startDate;
string endDate;
bool? useDates
}
var mydata = JsonConvert.DeserializeObject<Data>(jsonstring);
类数据{
词典关键词;
日期类日期;
.......
}
类日期类
{
字符串起始日期;
字符串结束日期;
布尔?乌塞代茨
}
var mydata=JsonConvert.DeserializeObject(jsonstring);
我没有填写整个数据类,但你明白了。我发现在输入数据的结构中创建一个对象,然后使用反序列化对象方法填充数据要容易得多。这也使代码更加清晰,并允许编译器检查拼写错误 我首先从一个强类型dto类开始,最好是一个DataContract,这样您就可以选择将其序列化为您想要的任何格式,即JSON、Xml、ProtoBuf等 注意:如果您使用的是富客户端应用程序而不是web应用程序,那么与大多数其他格式相比(请参阅:-JSON.NET是'NewtonSoft.JSON'),JSON的序列化/反序列化速度实际上相当慢,您可能需要选择不同的序列化格式。无论最终使用哪种格式,您仍然可以重复使用相同的DTO,例如,上面的代码类似于:
[DataContract]
public class MyDto
{
[DataMember]
public Keywords keywords { get; set; }
}
[DataContract]
public class Keywords
{
[DataMember]
public List<string> anyString { get; set; }
[DataMember]
public Dictionary<string,string> allString { get; set; }
[DataMember]
public List<string> exactString { get; set; }
[DataMember]
public List<string> notString { get; set; }
[DataMember]
public List<string> highlightString { get; set; }
}
var dto = new MyDto { Keywords = { allString = {{"a5349f533e3aa3ccbc27de2638da38d6", "olympics"}} };
var json = JsonConvert.SerializeObject(dto);
var fromJson = JsonConvert.DeserializeObject<MyDto>(json);
[DataContract]
公共类MyDto
{
[数据成员]
公共关键字{get;set;}
}
[数据合同]
公共类关键字
{
[数据成员]
公共列表任意字符串{get;set;}
[数据成员]
公共字典allString{get;set;}
[数据成员]
公共列表exactString{get;set;}
[数据成员]
公共列表notString{get;set;}
[数据成员]
公共列表高亮字符串{get;set;}
}
var dto=new MyDto{Keywords={allString={{“a5349f533e3aa3ccbc27de2638da38d6”,“奥运会”};
var json=JsonConvert.SerializeObject(dto);
var fromJson=JsonConvert.DeserializeObject(json);
编辑:添加链接
您可能在JSON.NET上遇到问题,在这种情况下,您应该尝试其他JSON.NET序列化程序/反序列化程序。Microsoft提供了.NET v3.5中包含的System.Runtime.Serialization.JSON.DataContractJsonSerializer。以下是一些帮助程序类,向您展示如何使用JSON和JSON
是另一个用于.NET的JSON序列化程序,但它比其他程序慢,我发现它对泛型没有很好的支持。是的,你的问题
//criteria
SearchMasterSearchCriteria smCriteria = new SearchMasterSearchCriteria();
//keywords
SMKeywords smKeywords = new SMKeywords(); ;
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("a5349f533e3aa3ccbc27de2638da38d6", "olympics");
dict.Add("9cfa7aefcc61936b70aaec6729329eda", "games");
smKeywords.allString = dict;
//category
Dictionary<int, string> categorieDict = new Dictionary<int, string>();
categorieDict.Add(2488, "Olympics 2012 (not participation)");
categorieDict.Add(8876, "Olympics and culture");
//taxonomies
Dictionary<string, Dictionary<int, string>> taxonomiesDict = new Dictionary<string, Dictionary<int, string>>();
taxonomiesDict.Add("Topics", categorieDict);
//metadata
Dictionary<int, string> metadataDict = new Dictionary<int, string>();
metadataDict.Add(1, @"private/n");
//clusters
Dictionary<string, Dictionary<int, string>> clustersDict = new Dictionary<string, Dictionary<int, string>>();
clustersDict.Add("permission", metadataDict);
//dates
SMDates smDates = new SMDates();
smDates.startDate = "15-01-2008";
smDates.endDate = "15-09-2009";
smDates.useDates = true;
//sort
SMSort smSort = new SMSort();
smSort.sortId = 1;
smSort.sortType = 2;
smSort.sort = "datetime";
smSort.sortOrder = "descending";
//add to criteria.
smCriteria.keywords = smKeywords;
smCriteria.clusters = clustersDict;
smCriteria.taxonomies = taxonomiesDict;
smCriteria.dates = smDates;
smCriteria.sort = smSort;
//serialize
string json = JsonConvert.SerializeObject(smCriteria);
var mydata1 = JsonConvert.DeserializeObject<SearchMasterSearchCriteria>(json);
contentSearchCriteria = contentSearchCriteria.Replace("[]", "{}");
var mydata = JsonConvert.DeserializeObject<SearchMasterSearchCriteria>(contentSearchCriteria);
class Data {
Dictionary<string, Dictionary<string, string>> keywords;
DatesClass dates;
.......
}
class DatesClass
{
string startDate;
string endDate;
bool? useDates
}
var mydata = JsonConvert.DeserializeObject<Data>(jsonstring);
[DataContract]
public class MyDto
{
[DataMember]
public Keywords keywords { get; set; }
}
[DataContract]
public class Keywords
{
[DataMember]
public List<string> anyString { get; set; }
[DataMember]
public Dictionary<string,string> allString { get; set; }
[DataMember]
public List<string> exactString { get; set; }
[DataMember]
public List<string> notString { get; set; }
[DataMember]
public List<string> highlightString { get; set; }
}
var dto = new MyDto { Keywords = { allString = {{"a5349f533e3aa3ccbc27de2638da38d6", "olympics"}} };
var json = JsonConvert.SerializeObject(dto);
var fromJson = JsonConvert.DeserializeObject<MyDto>(json);
{"taxonomies": {"taxonomies":[{"taxonomy": {"Topics": {1212, "foo"}}}]}
class SMSearchCriteria
{
public SMKeywords keywords { get; set; }
public SMDates dates { get; set; }
public SMClusters clusters { get; set; }
public SMTaxominies taxonomies { get; set; }
public SMSort sort { get; set; }
}
class SMTaxominies
{
public Dictionary<string, string> Topics;
public Keywords<string, string> Keywords;
}
var jsonResult = JObject.Parse(jsonString);
var sortItem = from s in jsonResult["sort"]
select new MySortObject{
SortId = s.Value<int>("sortId")
};