100分询问使用DataContractJsonSerializer 反序列化复杂JSON时的问题

r_y_y_d 2009-05-21 09:04:17
现在JSON如下:

{"id":"222332","moreinfo":"{"info1":"haha","info2":"heihei"}"}

那么我定义如下类


<DataContract()> _
Public Class MainClass

Private _ID As String

Private _MoreInfo As MoreInfoClass

<DataMember(Name:="id")> _
Property ID() As Integer
Get
Return _ID
End Get
Set(ByVal value As Integer)
_ID = value
End Set
End Property

<DataMember(Name:="moreinfo")> _
Property MoreInfo() As MoreInfoClass
Get
Return _MoreInfo
End Get
Set(ByVal value As MoreInfoClass)
_MoreInfo = value
End Set
End Property

Public Sub New()
_ID = ""
_MoreInfo = New MoreInfoClass
End Sub

End Class

<DataContract()> _
Public Class MoreInfoClass

Private _Info1 As String

Private _Info2 As String

<DataMember(Name:="info1")> _
Property Info1() As String
Get
Return _Info1
End Get
Set(ByVal value As String)
_Info1 = value
End Set
End Property

<DataMember(Name:="info2")> _
Property Info2() As String
Get
Return _Info2
End Get
Set(ByVal value As String)
_Info2 = value
End Set
End Property

Public Sub New()
_Info1 = ""
_Info2 = ""
End Sub
End Class


两个类

反序列化代码如下


Dim JsonString as String="最上面的JSON"
Dim JsonSerializer As New DataContractJsonSerializer(GetType(MainClass))
Dim Stream As New MemoryStream(Encoding.UTF8.GetBytes(JsonString))
Dim TempReturn As MainClass = JsonSerializer.ReadObject(Stream)



为什么总是出现应为状态“Element”。。遇到名称为“”、命名空间为“”的“Text”。 这样的错误

是不是里面嵌套一个类后,定义方法不一样还是怎么的,谁知道呢?????

...全文
1299 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
微创社(MCC) 2009-06-12
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace pcTest.Kaixin001.Entity
{
//money_minute
//money_max
[DataContract]
class Config
{
[DataMember(Name = "money_minute")]
public string money_minute { get; set; }

[DataMember(Name = "money_max")]
public string money_max { get; set; }

}

//vuid
//uid
//neighbor
//isfriend
//first_fee_parking
//first_free_parking
//real_name
//ta
//logo50
//logo20
//avenue
//cash
//scene
//sceneid
//showmoneyminute
//online2
[DataContract]
class User
{
[DataMember(Name = "vuid")]
public string vuid { get; set; }

[DataMember(Name = "uid")]
public string uid { get; set; }

[DataMember(Name = "neighbor")]
public string neighbor { get; set; }

[DataMember(Name = "isfriend")]
public string isfriend { get; set; }

[DataMember(Name = "first_fee_parking")]
public string first_fee_parking { get; set; }

[DataMember(Name = "first_free_parking")]
public string first_free_parking { get; set; }

[DataMember(Name = "real_name")]
public string real_name { get; set; }

[DataMember(Name = "ta")]
public string ta { get; set; }

[DataMember(Name = "logo50")]
public string logo50 { get; set; }

[DataMember(Name = "logo20")]
public string logo20 { get; set; }

[DataMember(Name = "avenue")]
public string avenue { get; set; }

[DataMember(Name = "cash")]
public string cash { get; set; }

[DataMember(Name = "scene")]
public string scene { get; set; }

[DataMember(Name = "sceneid")]
public string sceneid { get; set; }

[DataMember(Name = "showmoneyminute")]
public string showmoneyminute { get; set; }

[DataMember(Name = "online2")]
public string online2 { get; set; }

}

//parkid
//car_uid
//carid
//ctime
//car_real_name
//car_logo20
//car_isfriend
//car_logo_big
//car_logo_small
//car_logo_flash
//car_police
//car_profit
//car_trademark
//car_trademarkname
//car_price
//car_name
[DataContract]
class Parking
{
[DataMember(Name = "parkid")]
public string parkid { get; set; }

[DataMember(Name = "car_uid")]
public string car_uid { get; set; }

[DataMember(Name = "carid")]
public string carid { get; set; }

[DataMember(Name = "ctime")]
public string ctime { get; set; }

[DataMember(Name = "car_real_name")]
public string car_real_name { get; set; }

[DataMember(Name = "car_logo20")]
public string car_logo20 { get; set; }

[DataMember(Name = "car_isfriend")]
public string car_isfriend { get; set; }

[DataMember(Name = "car_logo_big")]
public string car_logo_big { get; set; }

[DataMember(Name = "car_logo_small")]
public string car_logo_small { get; set; }

[DataMember(Name = "car_logo_flash")]
public string car_logo_flash { get; set; }

[DataMember(Name = "car_police")]
public string car_police { get; set; }

[DataMember(Name = "car_profit")]
public string car_profit { get; set; }

[DataMember(Name = "car_trademark")]
public string car_trademark { get; set; }

[DataMember(Name = "car_trademarkname")]
public string car_trademarkname { get; set; }

[DataMember(Name = "car_price")]
public string car_price { get; set; }

[DataMember(Name = "car_name")]
public string car_name { get; set; }

}

//carid
//price
//neighbor
//park_uid
//parkid
//ctime
//car_name
//car_logo_big
//car_logo_small
//car_logo_flash
//car_trademark
//car_trademarkname
//car_police
//park_real_name
//park_logo20
//park_profit
//park_moneyminute
[DataContract]
class Car
{
[DataMember(Name = "carid")]
public string carid { get; set; }

[DataMember(Name = "price")]
public string price { get; set; }

[DataMember(Name = "neighbor")]
public string neighbor { get; set; }

[DataMember(Name = "park_uid")]
public string park_uid { get; set; }

[DataMember(Name = "parkid")]
public string parkid { get; set; }

[DataMember(Name = "ctime")]
public string ctime { get; set; }

[DataMember(Name = "car_name")]
public string car_name { get; set; }

[DataMember(Name = "car_logo_big")]
public string car_logo_big { get; set; }

[DataMember(Name = "car_logo_small")]
public string car_logo_small { get; set; }

[DataMember(Name = "car_logo_flash")]
public string car_logo_flash { get; set; }

[DataMember(Name = "car_trademark")]
public string car_trademark { get; set; }

[DataMember(Name = "car_trademarkname")]
public string car_trademarkname { get; set; }

[DataMember(Name = "car_police")]
public string car_police { get; set; }

[DataMember(Name = "park_real_name")]
public string park_real_name { get; set; }

[DataMember(Name = "park_logo20")]
public string park_logo20 { get; set; }

[DataMember(Name = "park_profit")]
public string park_profit { get; set; }

[DataMember(Name = "park_moneyminute")]
public string park_moneyminute { get; set; }

}

//error
//config
//user[]
//parking[]
//car[]
[DataContract]
class UserData
{
[DataMember(Name = "error")]
public string Error { get; set; }

[DataMember(Name = "config")]
public Config Config { get; set; }

[DataMember(Name = "user")]
public User User { get; set; }

[DataMember(Name = "parking")]
public Parking[] Parking { get; set; }

[DataMember(Name = "car")]
public Car[] Car { get; set; }

}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace pcTest.Kaixin001.Entity
{
//uid
//real_name
//ta
//full
//scenemoney
//scenename
//neighbor
//online
[DataContract]
class Friend
{
[DataMember(Name = "uid")]
public string uid { get; set; }

[DataMember(Name = "real_name")]
public string real_name { get; set; }

[DataMember(Name = "ta")]
public string ta { get; set; }

[DataMember(Name = "full")]
public string full { get; set; }

[DataMember(Name = "scenemoney")]
public string scenemoney { get; set; }

[DataMember(Name = "scenename")]
public string scenename { get; set; }

[DataMember(Name = "neighbor")]
public string neighbor { get; set; }

[DataMember(Name = "online")]
public string online { get; set; }

}
}
微创社(MCC) 2009-06-12
  • 打赏
  • 举报
回复
下午花了点时间研究了一下,发现上面回答错了.
其实DataContractJsonSerializer的方案是最佳的.
试着反序列化了一下开心网的数据,效果不错.
连字符转义和UNICODE都自动解决了,这个要好于Newtonsoft库.

//--------json/test/userdata-------
string strUserData = ContentHelper.GetMidString(HTML, "v_userdata = ", ";");
jsr = new DataContractJsonSerializer(typeof(UserData));
ms = new MemoryStream(Encoding.UTF8.GetBytes(strUserData));
UserData userData = (UserData)jsr.ReadObject(ms);

Console.WriteLine("ERROR:{0}", userData.Error);
Console.WriteLine();

Console.WriteLine("CONFIG MIN:{0}", userData.Config.money_minute);
Console.WriteLine("CONFIG MAX:{0}", userData.Config.money_max);
Console.WriteLine();

Console.WriteLine("ParKing ID [0]:{0}", userData.Parking[0].parkid);
Console.WriteLine("ParKing ID [1]:{0}", userData.Parking[1].parkid);
Console.WriteLine();

Console.WriteLine("VUID:{0}", userData.User.vuid);
Console.WriteLine("UID:{0}", userData.User.uid);
Console.WriteLine("Neighbor:{0}", userData.User.neighbor);
Console.WriteLine("IsFriend:{0}", userData.User.isfriend);
Console.WriteLine("FirstFeeParking:{0}", userData.User.first_fee_parking);
Console.WriteLine("FirstFreeParking:{0}", userData.User.first_free_parking);
Console.WriteLine("RealName:{0}", userData.User.real_name);
Console.WriteLine("Ta:{0}", userData.User.ta);
Console.WriteLine("Logo50:{0}", userData.User.logo50);
Console.WriteLine("Logo20:{0}", userData.User.logo20);
Console.WriteLine("Avenue:{0}", userData.User.avenue);
Console.WriteLine("Cash:{0}", userData.User.cash);
Console.WriteLine("Scene:{0}", userData.User.scene);
Console.WriteLine("Sceneid:{0}", userData.User.sceneid);
Console.WriteLine("Showmoneyminute:{0}", userData.User.showmoneyminute);
Console.WriteLine("Online2:{0}", userData.User.online2);
Console.WriteLine();

string strFriendData = ContentHelper.GetMidString(HTML, "v_frienddata = ", ";");
//strFriendData = "{\"friend\":" + strFriendData + "}";
jsr = new DataContractJsonSerializer(typeof(Friend[]));
ms = new MemoryStream(Encoding.UTF8.GetBytes(strFriendData));
Friend[] friendData = (Friend[])jsr.ReadObject(ms);

Console.WriteLine("uid:{0}", friendData[0].uid);
Console.WriteLine("uid:{0}", friendData[0].real_name);
Console.WriteLine("uid:{0}", friendData[0].ta);
Console.WriteLine("uid:{0}", friendData[0].full);
Console.WriteLine("uid:{0}", friendData[0].scenemoney);
Console.WriteLine("uid:{0}", friendData[0].scenename);
Console.WriteLine("uid:{0}", friendData[0].neighbor);
Console.WriteLine("uid:{0}", friendData[0].online);

jsr = null;
ms = null;
微创社(MCC) 2009-06-12
  • 打赏
  • 举报
回复
DataContractJsonSerializer不能实现复杂类型的反序列化。

有两种替代方案。
1)拼接法,这个比较麻烦。
2)第三方库
Newtonsoft.Json.JavaScriptConvert.DeserializeObject
可用来把JSON字符串转成实体,而且非常简单。




bbb332 2009-05-21
  • 打赏
  • 举报
回复
不懂
友情帮顶
光宇广贞 2009-05-21
  • 打赏
  • 举报
回复
不是,因为VB语言有其自己的特色……所以有些问题是VB独有的,虽然都是net平台下的语言……你贴出来的是简单,没看出有什么不妥的……能力有限……能力有限……
r_y_y_d 2009-05-21
  • 打赏
  • 举报
回复
这几句代码很简单的啊,就是2个类
还有一段反序列化代码

就是想寻求复杂JSON使用DataContractJsonSerializer反序列化的已有解决方案,这个是我自己写的
光宇广贞 2009-05-21
  • 打赏
  • 举报
回复
我还以为是C#的……看不懂VB……请转为C#再贴上来……
zhaoqiliang527 2009-05-21
  • 打赏
  • 举报
回复
虽然不懂,但是支持一下...

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧