标签: jsonserializer

在将Entity Framework对象图序列化为Json时防止StackOverflowException

我想将一个实体框架自我跟踪实体完整对象图(一对多关系中的父/子)序列化为Json.

为了序列化我使用ServiceStack.JsonSerializer.

这就是我的数据库的样子(为简单起见,我删除了所有不相关的字段):

ERD

我以这种方式获取完整的个人资料图:

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

4
推荐指数
2
解决办法
1万
查看次数

MVC 3 - JSON序列化程序

我有以下模型,视图和控制器.

模型

 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 jquery json jsonserializer asp.net-mvc-3

4
推荐指数
1
解决办法
9630
查看次数

ASP.Net Web API。一个项目中的JSON和XML响应

我有一个ASP.Net Web API项目,该项目已经包含用于以JSON格式返回结果的控制器。现在,我必须添加新的控制器,该控制器应仅接收和返回XML。我知道我可以使用以下选项来推送控制器以返回XML序列化的对象:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true
Run Code Online (Sandbox Code Playgroud)

但是,如果我愿意,我希望旧的控制器也将返回XML格式的数据,对吗?这不是我所需要的。那么,如何才能实现我的目标并仅从某些控制器返回XML序列化对象?谢谢。

更新

我尝试了建议的方法,但对我不起作用。我正在使用Fiddler进行测试。请注意,结果仍然是JSON(最后一个屏幕截图)。以下是其他信息:

控制器:

控制者

要求类别:

要求等级

回应类别:

回应等级

在Fiddler中的要求:

提琴手的要求

提琴手的回应:

提琴手的回应

controller xml-serialization jsonserializer asp.net-web-api

4
推荐指数
1
解决办法
5981
查看次数

Jackson EnumMap 键序列化

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)

java serialization json jsonserializer jackson

4
推荐指数
1
解决办法
3575
查看次数

当返回类型是标记接口时使用Jackson的多态序列化

我有一个返回标记接口的休息服务,这个接口有多个实现,并且在实现中没有任何公共属性.

    @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进行序列化.但杰克逊正在向浏览器发送空响应.任何人都建议如何在返回类型为标记接口时使用序列化.

rest spring-mvc jsonserializer jackson

4
推荐指数
1
解决办法
6645
查看次数

JsonSerializerSettings 更改属性名称的大小写,但不更改属性的属性名称

我正在对我的班级财产的驼峰式外壳使用以下设置。

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 实现这一点?

c# json jsonserializer

4
推荐指数
1
解决办法
6015
查看次数

使用 C# 将 JSON 字符串从 Camel 大小写转换为 Pascal 大小写

我有一个 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# 进行转换。

c# json jsonserializer json.net

4
推荐指数
1
解决办法
5469
查看次数

序列化包含转义(反斜杠和双引号)的JSON字符串Swift返回格式错误的对象

我有这样的后端响应字符串:

{
    "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)

json jsonserializer ios nsjsonserialization swift

4
推荐指数
1
解决办法
3015
查看次数

当 JsonSerializerOptions.PropertyNamingPolicy 没有效果时,如何在 Minimal API 中使用 Results.OK 时设置 JSON PropertyNamingPolicy?

我正在使用最小 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”响应管道正在查看哪些选项?

编辑:更正的方法名称

c# jsonserializer system.text.json .net-6.0 minimal-apis

4
推荐指数
1
解决办法
2378
查看次数

将vb.net类对象转换为vb.net中的JSON字符串

我是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)

vb.net json jsonserializer

3
推荐指数
1
解决办法
1万
查看次数