问题描述
求教各位大神,下面的json串如何在c#中设计一种结构直接用JsonConvert.DeserializeObject和JsonConvert.SerializeObject互转?字符串如下:[{"atnumber":"0001","strvalue":"20160322"},{"atnumber":"0002","strvalue":"20160321"},{"atnumber":"0003","strvalue":"20160320"},{"atnumber":"0004","value":0}]本来设计如下:基类,只有“atnumber”属性publicclassStreamNodeBase{publicStreamNodeBase(stringatNumber){this.atnumber=atNumber;}///<summary>///属性名///</summary>publicstringatnumber;//publicobjectvalue;}继承类,解决“strvalue”属性publicclassStrValueStreamNode:StreamNodeBase{publicStrValueStreamNode(stringatNumber,stringstrValue):base(atNumber){this.strvalue=strValue;}///<summary>///字符串值///</summary>//[JsonProperty(PropertyName="strvalue")]publicstringstrvalue;}继承类,解决“value”属性///<summary>///属性-数值型值StreamNode///</summary>publicclassValueStreamNode:StreamNodeBase{publicValueStreamNode(stringatNumber,floatvalue):base(atNumber){this.value=value;}///<summary>///字符串值///</summary>publicfloatvalue;}使用的类库为Newtonsoft.Json原来是使用List<StreamNodeBase>list对应上面的字符串,但这样用字符串转为c#对象后,只有”atnumber“属性,如何解决?
解决方案
解决方案二:
publicclassData{publicstringatnumber{get;set;}publicstringstrvalue{get;set;}}List<Data>orData[]
解决方案三:
你可以把strvalue和value看错两个字段,两个字段均为可选字段,写在同一类里
解决方案四:
引用楼主zhxzhlx的回复:
原来是使用List<StreamNodeBase>list对应上面的字符串,但这样用字符串转为c#对象后,只有”atnumber“属性,如何解决?
先抛开人家json反序列化机制,你先说说看,如果你手工操作,你怎么知道反序列化成为ValueStreamNode类型还是别的什么类型(继承了StreamNodeBase的其它几十种类型)的对象?这方面当然可以“设计”。但是要注意,是要每一个软件的设计师去自己去设计。而设计之前你就要先能够用大白话把逻辑说清楚。
解决方案五:
引用2楼xdashewan的回复:
你可以把strvalue和value看错两个字段,两个字段均为可选字段,写在同一类里
那要是StreamNodeBase有很多种子类呢?
解决方案六:
引用4楼sp1234的回复:
那要是StreamNodeBase有很多种子类呢?
的确,如果有很多种子类,这样的设计是很糟糕的,就好比数据库每增加一个种类就去表里加一个字段的设计一样糟糕。但不知道楼主能不能对json的数据格式做出修改,如果数据来自第三方就比较麻烦
解决方案七:
引用2楼xdashewan的回复:
你可以把strvalue和value看错两个字段,两个字段均为可选字段,写在同一类里
谢谢建议,我先考虑试试
解决方案八:
引用5楼xdashewan的回复:
Quote: 引用4楼sp1234的回复:
那要是StreamNodeBase有很多种子类呢?的确,如果有很多种子类,这样的设计是很糟糕的,就好比数据库每增加一个种类就去表里加一个字段的设计一样糟糕。但不知道楼主能不能对json的数据格式做出修改,如果数据来自第三方就比较麻烦
数据是别人的系统给我的,不能修改,并且我的类序列化之后也要用上述类似的格式发给对方,倒是只有这两种子类了,不会有其他的
解决方案九:
引用3楼sp1234的回复:
Quote: 引用楼主zhxzhlx的回复:
原来是使用List<StreamNodeBase>list对应上面的字符串,但这样用字符串转为c#对象后,只有”atnumber“属性,如何解决?先抛开人家json反序列化机制,你先说说看,如果你手工操作,你怎么知道反序列化成为ValueStreamNode类型还是别的什么类型(继承了StreamNodeBase的其它几十种类型)的对象?这方面当然可以“设计”。但是要注意,是要每一个软件的设计师去自己去设计。而设计之前你就要先能够用大白话把逻辑说清楚。
谢谢建议,我的意思是上面的json串只要在c#中有一种结构可以直接调用Newtonsoft.Json的接口进行序列化和反序列化,而不需要我自己去read,writejson字符串就可以,不需要局限于我原来的思路