关于JSON字符串在c#中Deserialize的一个问题

问题描述

求教各位大神,下面的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字符串就可以,不需要局限于我原来的思路

时间: 2024-07-30 13:57:24

关于JSON字符串在c#中Deserialize的一个问题的相关文章

小女子跪求大神帮忙~关于json字符串转换成实体类。。

问题描述 求实例比如说我现在的json字符串是[{"name":"aa","passwd":"bb"},{"name":"aa2","passwd":"bb2"},...],我需要把它转存到javaBean中,但是我在并不知道接受的JSON字符串的内容中name和passwd的先后位置(因为我做的是socket传输json格式的数据,并且其中的数据

json串 反序列化-如果获得的Json字符串中的Key名称与自定义的属性名字不同,怎样反序列化这个json串

问题描述 如果获得的Json字符串中的Key名称与自定义的属性名字不同,怎样反序列化这个json串 如题,如过我得到的json串类似是{"error_info":"1"},如果用JavaScriptSerializer的Deserialize方法,定义的属性名必须也叫error_info,如果我想使用属性名ErrorInfo这种,有没有什么系统方法可以将这个json串中的error_info 反序列化为ErrorInfo 解决方案 没遇见过这种需求的...一般都是先

Java中Json字符串直接转换为对象(包括多层List集合)

使用到的类:net.sf.json.JSONObject  使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-beanutils.jar,commons-httpclient.jar,commons-lang.jar,ezmorph.jar,morph-1.0.1.jar 下面是例子代码: // JSON转换 JSONObject jsonObj = JSONObject.fromObject(jsonSt

编码-golang中服务器获得json字符串格式不对

问题描述 golang中服务器获得json字符串格式不对 我发送的是{""userName"":""huloixia""userPass"":""030719""}而服务器得到的却是%7B%22userName%22%3A%22huloixia%22%2C%22userPass%22%3A%22030719%22%7D& 我不知道什么方法可以再编码回来 解决方

js中把JSON字符串转换成JSON对象最好的方法

 这篇文章主要介绍了js中把JSON字符串转换为JSON对象最好的方法,需要的朋友可以参考下 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析.   第一种解析方式:使用eval函数来解析,并且使用jQuery的each方法来遍历 用jQuery解析JSON数据的方法,作为jQuery异步请求的传输对象,jQuery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,

SQL中采用Newtonsoft.Json处理json字符串

原文 SQL中采用Newtonsoft.Json处理json字符串 使用环境:       SQL Server2005;       VS2010;       关于SQL中部署CLR程序集的方法,网上一搜一大把,需要了解的自行查阅,呵呵.       SQL中处理字符串实在是太弱了,连数组都不能处理,就更别说json字符串了,好吧,它不能处理,我就给它加个处理程序集(还好2005已经加入了这个功能).       首先对于CLR我也不太懂,而且到现在我也没搞懂怎么把一个dll注册到SQL,俺

android-转换数组中的JSON字符串为数组

问题描述 转换数组中的JSON字符串为数组 下面的字符串是作为json对象获取的: [ { "id": "picture1", "caption": "sample caption", "picname": "sample picture name" } ] 然后将它转换到数组中,这样可以填充到列表中. JSONArray myjsonarray = myjson.toJSONArray

将json字符串中数组节点转换为泛型list集合(gson)

开发中需要将json中节点单独取出某个节点,解析获取数据,此处对json字符串节点中数组节点,转换为泛型list集合,使用gson. google的gson的pom文件和jar:gson 代码如下: package my.demo.java.z.generic; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import com.google.gson

求大神-如何获取后台数据库里面的数据,返回JSON字符串,并把JSON字符串解析添加到ListView中

问题描述 如何获取后台数据库里面的数据,返回JSON字符串,并把JSON字符串解析添加到ListView中 如何获取后台数据库里面的数据,返回JSON字符串,并把JSON字符串解析添加到ListView中 解决方案 写一个http接口,组织好json数据,客户端接收,可以用gson直接转成对应的对象,listview需要一个List数据源,你把后台传来的数据放到list中,然后adapter的getview中处理显示 解决方案二: Newtonsoft.Json.dll有你想要的 解决方案三: