我有一个包含enum属性的类,在使用时序列化对象时JavaScriptSerializer,我的json结果包含枚举的整数值而不是它的string"name".有没有办法让枚举作为string我的json而不必创建自定义JavaScriptConverter?也许有一个属性,我可以装饰enum定义,或对象属性,?
举个例子:
enum Gender { Male, Female }
class Person
{
int Age { get; set; }
Gender Gender { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
期望的json结果:
{ "Age": 35, "Gender": "Male" }
Run Code Online (Sandbox Code Playgroud) 我正在使用.NET JSON解析器,并希望序列化我的配置文件,以便它是可读的.所以代替:
{"blah":"v", "blah2":"v2"}
Run Code Online (Sandbox Code Playgroud)
我想要更好的东西:
{
"blah":"v",
"blah2":"v2"
}
Run Code Online (Sandbox Code Playgroud)
我的代码是这样的:
using System.Web.Script.Serialization;
var ser = new JavaScriptSerializer();
configSz = ser.Serialize(config);
using (var f = (TextWriter)File.CreateText(configFn))
{
f.WriteLine(configSz);
f.Close();
}
Run Code Online (Sandbox Code Playgroud) 简介:在使用JavaScriptSerializer.Deserialize时,如何将JSON数据中的字段名称映射到.Net对象的字段名称?
更长版本:我从服务器API(未在.Net中编码)向我发送以下JSON数据
{"user_id":1234, "detail_level":"low"}
Run Code Online (Sandbox Code Playgroud)
我有以下C#对象:
[Serializable]
public class DataObject
{
[XmlElement("user_id")]
public int UserId { get; set; }
[XmlElement("detail_level")]
public DetailLevel DetailLevel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
其中DetailLevel是一个枚举,其中"低"作为其中一个值.
此测试失败:
[TestMethod]
public void DataObjectSimpleParseTest()
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
DataObject dataObject = serializer.Deserialize<DataObject>(JsonData);
Assert.IsNotNull(dataObject);
Assert.AreEqual(DetailLevel.Low, dataObject.DetailLevel);
Assert.AreEqual(1234, dataObject.UserId);
}
Run Code Online (Sandbox Code Playgroud)
最后两个断言失败,因为这些字段中没有数据.如果我将JSON数据更改为
{"userid":1234, "detaillevel":"low"}
Run Code Online (Sandbox Code Playgroud)
然后它通过.但我不能改变服务器的行为,我希望客户端类在C#语言中具有良好命名的属性.我不能使用LINQ to JSON,因为我希望它在Silverlight之外工作.看起来XmlElement标签没有任何效果.我不知道我在哪里知道它们是相关的,它们可能不是.
你如何在JavaScriptSerializer中进行字段名称映射?它可以完成吗?
我从a WebMethod中返回的每个对象都ScriptService被包装到一个JSON对象中,并且数据位于一个名为的属性中d.没关系.但我不希望将附加__type属性提供给客户端,因为我使用jQuery进行手动处理.
可能吗?
我想JavaScriptSerializer在我的应用程序中使用.
我最初收到了
找不到JavaScriptSerializer
我通过添加以下内容解决了
using System.Web.Script.Serialization;
Run Code Online (Sandbox Code Playgroud)
但是后面的子关键字Script用蓝线加下划线:
名称空间'System.Web'中不存在类型或命名空间'Script'(您是否缺少程序集引用?)
所以我在项目中添加了一个引用:
C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Web.Extensions.dll
这没有用.我仍然收到相同错误的蓝色下划线.引用标有感叹号黄色警告:

我在这个帖子上尝试了建议的解决方案,但正如@ user781490指出的那样,他们在我的情况下没有帮助.
知道如何解决这个问题吗?
我正在使用JavaScriptSerializer来序列化一些实体对象.
问题是,许多公共属性包含null或默认值.有没有办法让JavaScriptSerializer排除属性为null或默认值?
我希望生成的JSON不那么冗长.
我将反序列化的json文件的结构如下所示;
{
"id" : "1lad07",
"text" : "test",
"url" : "http:\/\/twitpic.com\/1lacuz",
"width" : 220,
"height" : 84,
"size" : 8722,
"type" : "png",
"timestamp" : "Wed, 05 May 2010 16:11:48 +0000",
"user" : {
"id" : 12345,
"screen_name" : "twitpicuser"
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个类,其字段名称为JavaScriptSerializer的属性.我将用于反序列化json的代码如下:
using (var reader = new StreamReader(twitpicResponse.GetResponseStream())) {
var responseBody = reader.ReadToEnd();
var deserializer = new JavaScriptSerializer();
var results = deserializer.Deserialize<Response>(responseBody);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我如何读取json文件上的用户字段.这就像下面;
"user" : {
"id" : 12345,
"screen_name" : "twitpicuser"
}
Run Code Online (Sandbox Code Playgroud)
它有子属性和值.我怎样才能在我的Response类中命名它们.我的回复课现在看起来像这样;
public class Response { …Run Code Online (Sandbox Code Playgroud) 我正在使用JavaScriptSerializer将文件的对象序列化为JSON格式.但结果文件没有可读格式.如何允许格式化以获取可读文件?
我上课了
public class Money
{
public string Currency { get; set; }
public decimal Amount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并希望将其序列化为JSON.如果我使用JavaScriptSerializer我得到
{"Currency":"USD","Amount":100.31000}
Run Code Online (Sandbox Code Playgroud)
由于API我必须符合需要JSON数量最多两位小数,我觉得应该可以以某种方式改变JavaScriptSerializer序列化十进制字段的方式,但我不知道如何.还有就是SimpleTypeResolver你可以在构造函数中通过,但它只能在类型,只要我能理解工作.该JavaScriptConverter,您可以通过添加RegisterConverters(...)似乎是要进行Dictionary.
我想得到
{"Currency":"USD","Amount":100.31}
Run Code Online (Sandbox Code Playgroud)
在我序列化之后.此外,改为双倍是不可能的.我可能需要进行一些舍入(100.311应该变为100.31).
有谁知道如何做到这一点?是否有替代方案JavaScriptSerializer可以让您更详细地控制序列化?
我正在使用JavaScriptSerializer序列化DateTime,但是当我反序列化它显示从序列化日期开始减少一天:
这是测试:
DateTime startDate=new DateTime(2012,1,20);//set the 20th of January
JavaScriptSerializer serializer=new JavaScriptSerializer();
string serializeDate= serializer.Serialize(startDate);
DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);//I get 19th of Jan
Assert.Equals(startDate, afterDeserialize);
Run Code Online (Sandbox Code Playgroud)
首先我认为它是因为javascript日期时间格式,但我知道javascript月份是零索引0=January,但我比原始日期少一天.