当前位置: 首页 > 面试题库 >

使用JSON.NET序列化对象时,如何添加自定义根节点?

狄峰
2023-03-14
问题内容

我向我的某些对象添加了自定义属性,如下所示:

[JsonCustomRoot("status")]
public class StatusDTO 
{
    public int StatusId { get; set; }
    public string Name { get; set; }
    public DateTime Created { get; set; }
}

该属性非常简单:

public class JsonCustomRoot :Attribute
{
    public string rootName { get; set; }

    public JsonCustomRoot(string rootName)
    {
        this.rootName = rootName;
    }
}

序列化对象实例时,JSON.NET的默认输出是:

{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}

现在的问题是: 如何使用自定义属性的值向JSON添加根节点,如下所示

{status:{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}}

我发现有几篇文章提到了IContractResolver接口,但是我不知道该怎么做。我的尝试包括这段未完成的代码:

protected override JsonObjectContract CreateObjectContract(Type objectType)
{
    JsonObjectContract contract = base.CreateObjectContract(objectType);

    var info = objectType.GetCustomAttributes()
                   .SingleOrDefault(t => (Type)t.TypeId==typeof(JsonCustomRoot));
    if (info != null)
    {
        var myAttribute = (JsonCustomRoot)info;
        // How can i add myAttribute.rootName to the root from here?
        // Maybe some other method should be overrided instead?
    }

    return contract;
}

问题答案:

这是专门用于Web API的解决方案,我也在使用:RootFormatter.cs

我基于为ASP.NET Web API创建JSONP格式器编写了它。

我没有使用自定义属性,而是重用了“标题”字段JsonObjectAttribute。这是一个用法代码:

using Newtonsoft.Json

[JsonObject(Title = "user")]
public class User
{
    public string mail { get; set; }
}

然后,将RootFormatter添加到您的App_Start中,并在中进行如下注册WebApiConfig

GlobalConfiguration.Configuration.Formatters.Insert(0, new RootFormatter());

我能够得到类似于WCF的包装响应WebMessageBodyStyle.Wrapped

{"user":{
  "mail": "foo@example.com"
}}


 类似资料:
  • 问题内容: 我有一堂课 我想将下面的JSON数据反序列化到上面的类/对象中 我的想法是在JSON中是一个对象,但我只想获取(在JSON中)在反序列化期间将像在类中那样传递。 如何使用Json.NET实现该目标? 我相信我可以使用CustomJsonConverter完成它。但是我很困惑。docs中的示例仅用于,但不适用。 问题答案: 我只是使用上面在问题中提到的方法解决了我的问题。在我完整的代码下

  • 问题内容: 我有以下课程,将其用作字典中的键: 我正在运行的测试在这里: 测试失败,因为Json.Net似乎正在使用字典键上的方法,而不是正确地序列化它们。上面测试得出的json是: 这显然是错误的。我如何使它工作? 问题答案: 这应该可以解决问题: 序列化: 通过调用,您正在序列化一个对象数组而不是字典。 反序列化: 在这里,您可以反序列化数组,然后通过调用检索字典。 我不确定输出是否满足您的期

  • 在一个项目中,我需要用自定义类加载器扩展标准类加载器。这样做的主要动机是在运行时扩展类路径。(有关此问题的解决方案,请参阅:https://stackoverflow.com/a/51584718/231397 ). 通过 工作正常,同时通过反序列化对象 失败,出现异常。原因是调用了标准类加载器,它不知道自定义类加载器。 问:使用自定义类加载器反序列化对象的正确方法是什么?

  • 我正在开发一个API,使用ASP公开一些数据。NET Web API。 在其中一个API中,客户端希望我们以格式公开日期。我不想为此更改全局设置(例如,),因为它非常特定于此客户端。我在为多个客户开发的解决方案中做到了这一点。 我能想到的一个解决方案是创建一个自定义的,然后将其放入我需要进行自定义格式化的属性中 例如。 只是想知道是否还有其他简单的方法。

  • 问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当

  • 问题内容: 确定,所以我编辑了问题,因为它不够清楚。 编辑2 :更新了JSON文件。 我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。 例如,如果在JSON中,我有以下内容: 我不想保留我当前的对象结构,即一个对象,其中包含一个和一个“总计”。但是我只想将