我想将一个实体框架自我跟踪实体完整对象图(一对多关系中的父/子)序列化为Json.
为了序列化我使用ServiceStack.JsonSerializer.
这就是我的数据库的样子(为简单起见,我删除了所有不相关的字段):

我以这种方式获取完整的个人资料图:
public Profile GetUserProfile(Guid userID)
{
using (var db = new AcmeEntities())
{
return db.Profiles.Include("ProfileImages").Single(p => p.UserId == userId);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是尝试序列化它:
Profile profile = GetUserProfile(userId);
ServiceStack.JsonSerializer.SerializeToString(profile);
Run Code Online (Sandbox Code Playgroud)
生产一个StackOverflowException.我相信这是因为EF提供了一个无限模型,可以将串行器拧紧.也就是说,我可以称之为:profile.ProfileImages[0].Profile.ProfileImages[0].Profile ...等等.
如何"展平"我的EF对象图或以其他方式阻止ServiceStack.JsonSerializer进入堆栈溢出情况?
jsonserializer entity-framework-4 self-tracking-entities c#-4.0 servicestack
我有以下模型,视图和控制器.
模型
public class Person {
public string Name;// { get; set; }
public string Occupation { get; set; }
public int Salary { get; set; }
public int[] NumArr { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
视图
<input type="button" id="Test" value="Test" />
@section Javascript{
<script type="text/javascript">
$(function () {
$("#Test").click(function () {
var data = { Name: "Michael Tom", Occupation: "Programmer", Salary: 8500, NumArr: [2,6,4,9] };
var url = "Home/GetJson";
$.ajax({
url: url,
dataType: "json",
type: "POST",
data: data,
traditional: true, …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.Net Web API项目,该项目已经包含用于以JSON格式返回结果的控制器。现在,我必须添加新的控制器,该控制器应仅接收和返回XML。我知道我可以使用以下选项来推送控制器以返回XML序列化的对象:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true
Run Code Online (Sandbox Code Playgroud)
但是,如果我愿意,我希望旧的控制器也将返回XML格式的数据,对吗?这不是我所需要的。那么,如何才能实现我的目标并仅从某些控制器返回XML序列化对象?谢谢。
更新
我尝试了建议的方法,但对我不起作用。我正在使用Fiddler进行测试。请注意,结果仍然是JSON(最后一个屏幕截图)。以下是其他信息:
控制器:

要求类别:

回应类别:

在Fiddler中的要求:

提琴手的回应:

Jackson 是否允许您自定义它序列化 EnumMap 键的方式?例如,如果我有
public enum MyKey
{
ABC, DEF, XYZ;
public String getKey()
{
return "my-key-" + ordinal();
}
}
Run Code Online (Sandbox Code Playgroud)
还有一些
public class MyObject
{
private final Map<MyKey,String> map = new EnumMap<>(MyKey.class);
public MyObject()
{
map.put(MyKey.ABC, "foo");
map.put(MyKey.DEF, "bar");
map.put(MyKey.XYZ, "baz");
}
public Map<MyKey,String> getMap()
{
return map;
}
}
Run Code Online (Sandbox Code Playgroud)
那么杰克逊将序列MyObject化为
{"map":{"ABC":"foo","DEF":"bar","XYZ":"baz"}}。
相反,我希望它像这样序列化
{"map":{"my-key-0":"foo","my-key-1":"bar","my-key-2":"baz"}}。我不想toString()为了这个工作而覆盖任何内容。这在杰克逊身上有可能吗?
我尝试这样做:
public class MyKeySerializer extends JsonSerializer<MyKey>
{
@Override
public void serialize(MyKey value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException …Run Code Online (Sandbox Code Playgroud) 我有一个返回标记接口的休息服务,这个接口有多个实现,并且在实现中没有任何公共属性.
@RequestMapping(value = "/users/{userName}", method = RequestMethod.GET)
public User getUser(@PathVariable("userName") String userName) {
return userService.getUser(userName);
}
Run Code Online (Sandbox Code Playgroud)
用户及其实现.注意:用户是标记界面.
public interface User {}
public AdminUser implements User { // some properties & its setters & getters }
public SupportUser implements User { // some properties & its setters & getters }
Run Code Online (Sandbox Code Playgroud)
我使用Jackson 1.9.1来序列化和反序列化.
当我达到以上服务时,我的回答低于响应
{}
Run Code Online (Sandbox Code Playgroud)
当我调试它时,我看到用户实现对象已准备好并发送回Jackson进行序列化.但杰克逊正在向浏览器发送空响应.任何人都建议如何在返回类型为标记接口时使用序列化.
我正在对我的班级财产的驼峰式外壳使用以下设置。
JsonSerializerSettings settings = new JsonSerializerSettings()
{
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
};
Run Code Online (Sandbox Code Playgroud)
对象中的某些属性属于其他类类型。我不想更改这些属性的大小写。
例如:
Public Class CaseToChange
{
public string StringProperty{get;set;} //Change to camelCase
public SomeOtherType OtherTypeProperty{get;set;} //Change name of this to camelCase but not property name of "SomeOtherType"
}
Run Code Online (Sandbox Code Playgroud)
如何使用 JsonSerializerSettings 实现这一点?
我有一个 JSON 字符串,它的密钥采用驼峰式大小写形式,但我需要将密钥转换为帕斯卡式大小写。
实际的 JSON 字符串
string jsonString = "{\"personName\":{\"firstName\":\"Emma\",\"lastName\":\"Watson\"}}";
Run Code Online (Sandbox Code Playgroud)
Expected JSON String : 需要从上面的 JSON 字符串转换。
string jsonString = "{\"PersonName\":{\"FirstName\":\"Emma\",\"LastName\":\"Watson\"}}";
Run Code Online (Sandbox Code Playgroud)
请帮助我如何使用 C# 进行转换。
我有这样的后端响应字符串:
{
"status": "success",
"data": "{\"name\":\"asd\",\"address\":\"Street 1st\"}"
}
Run Code Online (Sandbox Code Playgroud)
我认为问题是因为数据字符串中的双引号(“)。当我删除双引号时,序列化成功。但是响应来自后端,因此我必须处理它。
任何人都可以解决这个问题吗?
谢谢。
这是游乐场代码。
import Foundation
var jsonStr = """
{
"status": "success",
"data": "{\"name\":\"asd\",\"address\":\"Street 1st\"}"
}
"""
let data = jsonStr.data(using: .utf8)
if let d = data {
do {
let o = try JSONSerialization.jsonObject(with: d)
print(o)
} catch let e {
print(e)
}
} else {
print("DATA conversion ERROR")
}
Run Code Online (Sandbox Code Playgroud) 我正在使用最小 API 来重新创建旧的 REST 服务,因此我需要尽可能模仿以前服务的功能。旧服务中的信息返回帕斯卡大小写,我知道有一些旧客户端区分大小写。开箱即用的 .NET 6 在网络上序列化为驼峰式大小写,但可以使用以下代码覆盖:
builder.Services.Configure<JsonOptions>(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
Run Code Online (Sandbox Code Playgroud)
如果设置了断点,我可以看到策略最初设置为驼峰式大小写,然后重置为空。如果我随后使用JsonSerializer.Serialize它,它会按预期工作。唯一的问题是,如果我使用Results.OK(colection)它,就会回到驼峰式大小写,就好像它忽略了选项设置一样。我可以在模型类上使用声明性属性设置所有属性名称,并且按预期工作,因此内联声明可以工作,但在服务级别上的设置却不能。那么,“Results.OK”响应管道正在查看哪些选项?
编辑:更正的方法名称
我是ac#开发人员,具有在vb.net项目中工作的要求。我面临一个简单的问题,我需要在vb.net中将类对象转换为json字符串。问题是当我在转换后检查字符串时,我得到的输出为:
[{},{},{}]
Run Code Online (Sandbox Code Playgroud)
我试图将3个对象的值存储到其中,但是却得到3个空对象{}。我的代码是这样的:
Imports System.Web.Script.Serialization
Partial Class test
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim serializer As New JavaScriptSerializer
Dim msgObj As msg
Dim loginList As New List(Of msg)()
msgObj = New msg("mubashir", True)
loginList.Add(msgObj)
msgObj = New msg("yasir", False)
loginList.Add(msgObj)
msgObj = New msg("umar", True)
loginList.Add(msgObj)
Dim s As String = serializer.Serialize(loginList)
Response.Write(s)
End Sub
End Class
Public Class msg
Dim message As String
Dim status As Boolean
Sub New(ByRef Messag …Run Code Online (Sandbox Code Playgroud) jsonserializer ×10
json ×6
c# ×3
jackson ×2
.net-6.0 ×1
asp.net ×1
c#-4.0 ×1
controller ×1
ios ×1
java ×1
jquery ×1
json.net ×1
minimal-apis ×1
rest ×1
servicestack ×1
spring-mvc ×1
swift ×1
vb.net ×1