C# 如何序列化原始json字段?
我在数据库中有一个存储json字符串的字段 我希望当我以json结果返回它时,它将作为json原始数据返回,而不是以引号作为字符串扭曲 更新1(更多信息): 如果查看images字段,它包含一个原始json字符串值C# 如何序列化原始json字段?,c#,asp.net-mvc,linq,json.net,javascriptserializer,C#,Asp.net Mvc,Linq,Json.net,Javascriptserializer,我在数据库中有一个存储json字符串的字段 我希望当我以json结果返回它时,它将作为json原始数据返回,而不是以引号作为字符串扭曲 更新1(更多信息): 如果查看images字段,它包含一个原始json字符串值 但是在用JsonResult序列化它之后,它会被引号扭曲,因为它是一种字符串类型, 如何告诉序列化程序将图像字段作为原始json数据处理 var db = new ModelsContainer(); var res = db.Images.Order
但是在用JsonResult序列化它之后,它会被引号扭曲,因为它是一种字符串类型, 如何告诉序列化程序将图像字段作为原始json数据处理
var db = new ModelsContainer();
var res = db.Images.OrderByDescending(i=>i.DateCreated).Skip(skip).Take(take).Select( i => new {
id = i.Id,
dateCreated = i.DateCreated,
images = i.Images ,
user = new {
id = i.User.Id,
facebookId = i.User.FacebookId,
displayName = i.User.DisplayName
},
tags = i.Tags.Select( t => t.Value )
}).ToList();
return Json(res, JsonRequestBehavior.AllowGet);
[
{
"id":"5c528e88-f3a7-4b30-9746-980867325fd1",
"dateCreated":"\/Date(1364381593000)\/",
"images":"[{\"source\":\"http://localhost:9242/images/f4956702/6d34/42db/b28a/397d0eaf3097.jpg\",\"width\":237,\"height\":237},{\"source\":\"http://localhost:9242/images/87d47041/1522/4d10/9325/105851aae259.jpg\",\"width\":633,\"height\":633},{\"source\":\"http://localhost:9242/images/2a639272/9067/42fb/83ee/e88f0a0878f8.jpg\",\"width\":547,\"height\":547},{\"source\":\"http://localhost:9242/images/37caa7b2/e183/4efc/96eb/487e556501b2.jpg\",\"width\":1024,\"height\":1024}]",
"user":{"id":"ea39616d-6ff9-424b-b99b-7bee53e674bb","facebookId":"608215901","displayName":"Yonathan Garti"},
"tags":["test","test","test"]
},
...
]
您需要取消序列化数据。C#提供了一个类来处理JSON数据 摘录自:
通常,当在使用AJAX启用端点的服务操作中使用数据契约类型时,Windows通信基础(WCF)会自动处理JSON序列化和反序列化。然而,在某些情况下,您可能需要直接使用JSON数据——这就是本主题演示的场景
//Deserialize the JSON-encoded data into a new instance of Person by using the ReadObject method of the DataContractJsonSerializer.
stream1.Position = 0;
Person p2 = (Person)ser.ReadObject(stream1);
//Show the results.
Console.Write("Deserialized back, got name=");
Console.Write(p2.name);
Console.Write(", age=");
Console.WriteLine(p2.age);
使用Json.net,您可以定义自己的JSONConverter来应用特定的序列化行为。可以将其应用于特定类型,或者,如果有视图模型,可以应用于特定特性 在本例中,您希望使用
JsonWriter.WriteRawValue
将图像字符串作为原始字符串写入
即
我想你不明白我的问题,请阅读我的更新谢谢!你的解决方案很棒!!!但不幸的是,我无法实现它,因为我的类是由实体框架生成的。有没有一种方法可以告诉序列化程序关于一个需要类型转换器的字段,而不是使用属性?另一种解决方案是,如果您有一个自定义类型,JsonConverter将处理该类型,但在您的情况下,我相信它是一个普通字符串,因此无法工作。我的建议是创建一个自定义视图模型。在上面的代码中,您只需要使用自定义视图模型,而不是您初始化的匿名对象(res)。genius!!!我怎么没有看到我只需要用一些模型替换匿名类型,然后我就可以应用属性了!!!谢谢。即使您不能用属性装饰生成的属性,您也可以向序列化程序提供自定义ContractResolver,序列化程序将在运行时添加此转换器。看一看。在CreateProperties覆盖中,您需要检查您的特定类型,并将转换器添加到
图像的JsonProperty中。
public class PlainJsonStringConverter : Newtonsoft.Json.JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return reader.Value;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue((string)value);
}
}
public class MyViewModel
{
public string id { get; set; }
[Newtonsoft.Json.JsonConverter(typeof(PlainJsonStringConverter))]
public string images { get; set; }
/* ... */
}