注意:我发布了一个类似的问题,这是这个问题的祖先,因为我最初考虑使用JSON.NET来解析JSON,但我正在使用内置的反序列化器,所以这是一个不同的问题.
这就是我要做的事情:例如,我有一个名为Item的类.json有许多"元素"(如果这就是它们被称为 - 它们模仿Item类),每个元素包含3个字段:一个名为id的整数,一个名为name的字符串和一个名为creationTime的日期时间.我想将所有这些Item"元素"从json解析为Item对象列表.我在Item类中创建了3个字段以匹配JSON.
这就是我目前正在做的事情:
JavaScriptSerializer ser = new JavaScriptSerializer();
List<Item> items = ser.Deserialize<Item>(new StreamReader(response.GetResponseStream()).ReadToEnd());
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为我"无法将类型'superapi.Item'隐式转换为'System.Collections.Generic.List <superapi.Item>'".因此,我不知道如何解决这个问题,因为JSON中有许多Item架构的元素.是否有可能在foreach循环中执行此操作,在JSON中查找每个反序列化的项,将其添加到列表中,并继续循环?我将尝试使用一些类似的代码来做这件事,我将发布我的结果.
谢谢!
更新:这是一些JSON的样子:
[{
"Id": 1,
"Name": "First item name",
"creationTime": "\/Date(1247258293690)\/"
},
{
"Id": 2,
"Name": "Second item name",
"creationTime": "\/Date(1247088323430)\/"
}]
Run Code Online (Sandbox Code Playgroud)
这是我的Item类的样子:
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime creationTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 你能帮我解决这个问题吗?我有一个asp.net应用程序,在此我使用Javascript序列化程序来序列化数据集,然后转换为列表.该代码如下所示.
JavaScriptSerializer json = new JavaScriptSerializer();
strJson = json.Serialize(aclDoc);
Run Code Online (Sandbox Code Playgroud)
但是,在反序列化时,我得到一个ArguementException,就像我的Json值的无效Json Primitives一样.我的json值是
[{"Id":"F79BA508-F208-4C37-9904-DBB1DEDE67DB","App_Id":"ScriptFlow","Name":"New form","FriendlyName":"","Read":"Revoke","ReadRule":"a353776f-cbdc-48b7-a15b-4a2316d19b05","Update":"Grant","UpdateRule":"be30c34e-33ec-4c0a-9f09-4fd483f5f1b9","Create":"Revoke","CreateRule":"898dce4d-4709-45b6-8942-d7efb07cbd86","Delete":"Revoke","DeleteRule":"aa14d435-dec8-4ade-ad9b-830ae5ee15d0"}][{"Id":"1","Doc_Id":"858E013C-5775-4FDF-AA1E-2C84053EE39F","Name":"TextBox1","FriendlyName":"TextBox1","Read":"Grant","ReadRule":"0a2e3c0e-ad8f-4f75-9160-cfd9827ac894","Update":"Grant","UpdateRule":"ecad3cf4-104f-44dc-b815-de039f3a0396"},{"Id":"2","Doc_Id":"858E013C-5775-4FDF-AA1E-2C84053EE39F","Name":"TextBox2","FriendlyName":"TextBox2","Read":"Grant","ReadRule":"81e0e9ef-09f7-4c25-a58e-d5fdfbd4c2ba","Update":"Grant","UpdateRule":"2047f662-c881-413b-a1f9-69f15bf667fc"}]
Run Code Online (Sandbox Code Playgroud)
反序列化的代码是:
JavaScriptSerializer json = new JavaScriptSerializer();
lstDoc = json.Deserialize<List<ACLDocument>>(value);
return lstDoc;
Run Code Online (Sandbox Code Playgroud)
其中lstDoc是我班级类型的列表集合
我得到了这样的例外:
Invalid JSON primitive:
{"Id":"1","Doc_Id":"858E013C-5775-4FDF-AA1E-2C84053EE39F","Name":"TextBox1","FriendlyName":"TextBox1","Read":"Grant","ReadRule":"0a2e3c0e-ad8f-4f75-9160-cfd9827ac894","Update":"Grant","UpdateRule":"ecad3cf4-104f-44dc-b815-de039f3a0396"},{"Id":"2","Doc_Id":"858E013C-5775-4FDF-AA1E-2C84053EE39F","Name":"TextBox2","FriendlyName":"TextBox2","Read":"Grant","ReadRule":"81e0e9ef-09f7-4c25-a58e-d5fdfbd4c2ba","Update":"Grant","UpdateRule":"2047f662-c881-413b-a1f9-69f15bf667fc"}].
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题.提前致谢
我需要从C#Web服务获取Json数据.
我知道基于此有几个问题,请相信我,我已阅读了不少内容,但只是为了让我更加困惑.
这就是我所做的:
在我的网络服务中,我包括:[System.Web.Script.Services.ScriptService]用于课程和[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]方法
我还用a JavaScriptSerializer()来将我的数据转换为字符串
我正在使用这个服务 $.getJSON()
如果我不使用它,我会收到跨域引用错误.
为此,我不得不设置m服务来获取回调函数名称,所以我传递t his.Context.Request["callback"]+序列化的Json数据;
但是在输出中我把它包裹起来
< string xmlns="http://XYZ...">
Run Code Online (Sandbox Code Playgroud)
标签内的数据采用我需要的格式
我还尝试使用以下方法设置内容类型 $.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
但仍然没有成功.
稍后添加:我接受了frenchie的anwser,因为我知道这是正确的方法,但我仍然不能让它工作......我只是将webservice和网站放在同一个域并使用xml,我知道这不是最好的方法,但是我花了两天时间而且不能浪费更多.
我有一个包含一种方法的Web服务:
[WebMethod]
public string Movies()
{
using (var dataContext = new MovieCollectionDataContext())
{
var query = dataContext.Movies.Select(m =>new{m.Title,m.ReleaseDate}).Take(20);
var serializer = new JavaScriptSerializer();
return serializer.Serialize(query);
}
}
Run Code Online (Sandbox Code Playgroud)
该方法正确地序列化了对象,但是当我在FireBug中查看响应时,它看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">[{"Title":"SQL","ReleaseDate":"\/Date(1224007200000)\/"},{"Title":"Termonator Salvation","ReleaseDate":"\/Date(1224007200000)\/"}]</string>
Run Code Online (Sandbox Code Playgroud)
这是我使用Kendo Data Source的jQuery方法
$(function () {
alert("Welcome To Kendo");
var dataSource = new kendo.data.DataSource(
{
transport: {
read: {
type: "POST",
dataType: "json",
url: "/MovieService.asmx/Movies"
// contentType: "application/json; charset=utf-8"
}
},
change: function (e) {
alert(e);
},
error: function (e) {
alert(e[2]);
},
pageSize: 10,
schema: …Run Code Online (Sandbox Code Playgroud) 我发现我的webmethod正在返回数据
{ "d":
[
{"id":"1","itemtxt":"Masters"},
{"id":"2","itemtxt":"Transactions"},
{"id":"3","itemtxt":"Misch. Reports"}
]
}
Run Code Online (Sandbox Code Playgroud)
如果您注意到,该数组被命名为" d ".这是为什么 ?它有什么规则吗?
为了您的信息,我将返回一个对象列表(List<webitem>)
public class webitem
{
public webitem(string kid, string kval)
{
this.id = kid;
this.itemtxt = kval;
}
public string id { get; set; }
public string itemtxt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这个" d "是什么意思?对于我从网络方法发送的任何数据,它总是相同吗?或者它会根据我的数据类型/类类型而改变?
编辑
这是web方法
[WebMethod]
public List<webitem> GetSubModules(string key)
{
string s = " order by smid";
if (key != null)
s = " where moduleid=" + key + s; …Run Code Online (Sandbox Code Playgroud) 我创建了一个C#ASP.NET方法,它只需要在同一个类中包含一个包含JSON的字符串属性.我的问题是每当我键入.Deserialize方法(注释行)时,Visual Studio 2013在事件日志中崩溃并出现"未处理的异常".
public object JSONAsObject()
{
object obj = new object();
JavaScriptSerializer js = new JavaScriptSerializer();
// obj = js.Deserialize<object>(this._json);
return obj;
}
Run Code Online (Sandbox Code Playgroud)
如果我在评论中写下这一行(如上所述)然后删除评论没有问题,所以问题似乎是Intellisense或我编写代码的方式 - 任何人都有任何想法?
Application: devenv.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentNullException
Stack:
at System.Text.RegularExpressions.Regex.Escape(System.String)
at Microsoft.OneCode.Utilities.UserControl.CodeSnippetsTextBox.UpdateRegex()
at Microsoft.OneCode.Utilities.UserControl.CodeSnippetsTextBox.OnMyWorkCollectionChanged(System.Object, System.Collections.Specialized.NotifyCollectionChangedEventArgs)
at System.Collections.ObjectModel.ObservableCollection`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs)
at System.Collections.ObjectModel.ObservableCollection`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].InsertItem(Int32, System.__Canon)
at System.Collections.ObjectModel.Collection`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Add(System.__Canon)
at Microsoft.OneCode.IntellisensePresenter.ViewModel.IntellisenseViewModel.UpdateCodeSnippets(System.Collections.Generic.IEnumerable`1<Microsoft.OneCode.DataModel.CodeSearchResult>)
at Microsoft.OneCode.IntellisensePresenter.ViewModel.IntellisenseViewModel+<>c__DisplayClass5.<SearchCode>b__2()
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, …Run Code Online (Sandbox Code Playgroud) 如何找到此问题的来源,JavaScriptSerializer无法对JavaScriptSerializer序列化的日期值进行反序列化?
在调用应用程序中:
var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(model);
// generates this json
{'Guid':'guid','OrderNumber':'1','OrderDate':'\/Date(1299456000000)\/',
'OrderStatus':'Completed','DiscountRate':0.0000}
Run Code Online (Sandbox Code Playgroud)
在接收申请中:
string json = @"{'Guid':'guid','OrderNumber':'1','OrderDate':'\/Date(1299456000000)\/',
'OrderStatus':'Completed','DiscountRate':0.0000}";
var serializer = new JavaScriptSerializer();
var model = serializer.Deserialize(json);
Run Code Online (Sandbox Code Playgroud)
引发String was not recognized as a valid DateTime异常.
如果JavaScriptSerializer序列化日期,为什么JavaScriptSerializer不能反序列化?
我正在尝试使用Net 3.5中的JavaScriptSerializer生成以下JSON结构:
{
"chart": "pie",
"series": [
{
"name": "Browsers",
"data": [
[
"Firefox",
6
],
[
"MSIE",
4
]
],
"size": "43%"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我面临的问题是关于数据部分.我似乎无法创建一个序列化为数据上述结构的类.
我已经阅读了其他帖子哪种触摸主题,但解决方案似乎总是使用JSON.Net.例如,使用JavaScriptSerializer序列化字典.虽然,我通常希望通过使用.Net 3.5框架中的JavaScriptSerializer或其他内置功能来解决它.
如何生成数据部分?
*编辑使用JavaScriptSerializer解决它的方法是为要序列化的对象上的data属性创建一个对象数组.
输入参数数据为"Firefox:6 \nMSIE:4 \nChrome:7".
public object [] GetData(string data){var dataStrArr = data.Split(new [] {Environment.NewLine},StringSplitOptions.None);
var dataArr = new object[dataStrArr.Length];
for (var index = 0; index < dataStrArr.Length; index++)
{
var component = dataStrArr[index];
var componentArr = component.Split(':');
if (componentArr.Length != 2) …Run Code Online (Sandbox Code Playgroud) 我有以下数据:
{ "数据":{ "ID": "7IaWnXo", "标题":空, "说明":NULL, "日期时间":1397926970, "类型": "图像/ PNG", "动画片":假,"宽度"60," 高度 ":60," 大小 ":1277," 意见 ":0," 带宽 ":0," 最爱 ":假的," NSFW ":空," 节 ":空," deletehash": "KYIfVnHIWWTPifh", "链接": "http://i.imgur.com/7IaWnXo.png"}, "成功":真实的, "身份":200}
而我正在尝试将其序列化为:
public struct ImageInfoContainer
{
public ImageInfo data {get; set;}
bool success { get; set; }
string status { get; set; }
}
public struct ImageInfo
{
public string id {get; set;}
public string title { get; set; }
public string url { get; set; }
public string …Run Code Online (Sandbox Code Playgroud) 考虑 C# 中的以下 JSON 字符串:
{
"BuyerRegion":"BuyerRegion [0][27]",
"SellerRegion":"SellerRegion [0][29]",
"HubRegion":"HubRegion [0][31]",
"PartNo":"TINT_MNUM [0][3]",
"BuyerCompID":"BuyerCompId [0][28]",
"SellerCompId":"SellerCompId [0][30]",
"HubCompId":"HubCompId [0][32]"
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用以下命令将字符串反序列化为 C# 中的动态对象:
object obj = new JavaScriptSerializer().Deserialize<object>(s); //where s contains the JSON string
Run Code Online (Sandbox Code Playgroud)
但是,返回的obj是键/值对的数组:
知道如何将它们反序列化为一个动态对象,我可以使用以下方式访问属性:
obj.BuyerRegion //returns "BuyerRegion [0][27]"
Run Code Online (Sandbox Code Playgroud)
JsonConvert/NewtonSoft 不是一个选择。