【发布时间】:2012-10-09 03:00:31
【问题描述】:
当使用 Json.NET 将 MVC 视图模型序列化为 json 时,我的视图模型 (public object Result { get; set;}) 上有一个通用对象属性,它被序列化为键值对而不是实际的 json 对象。有没有一个转换器可以用来强制它正确序列化?
这是 Json.NET 当前正在输出的内容:
"result": [
{
"key": "AssetId",
"value": "b8d8fb71-2553-485b-91bf-14c6c563d78b"
},
{
"key": "SearchResultType",
"value": "Assets"
},
{
"key": "Name",
"value": "abstract-q-c-1920-1920-8"
}
]
相反,我希望它输出以下内容:
"result": {
"AssetId": "b8d8fb71-2553-485b-91bf-14c6c563d78b",
"SearchResultType": "Assets",
"Name": "abstract-q-c-1920-1920-8"
}
编辑: 要回答如何填充该属性的问题,它是通过 RavenDB 索引:
public class SiteSearchIndexTask : AbstractMultiMapIndexCreationTask<SiteSearchResult>
{
public class Result
{
public object[] Content { get; set; }
}
public override string IndexName
{
get
{
return "SiteSearch/All";
}
}
public SiteSearchIndexTask()
{
AddMap<Asset>(items => from item in items
where item.IsDeleted == false
select new
{
Id = item.Id.ToString(),
ObjectId = item.Id,
ResultType = SearchResultType.Assets,
Title = item.Name.Boost(3),
Tags = item.Tags.Select(x => x.Name).Boost(2),
Result = (object)item,
Query = string.Join(" ", item.Description)
});
AddMap<User>(items => from item in items
where item.IsDeleted == false
select new
{
Id = item.Id,
ObjectId = item.UserId,
ResultType = SearchResultType.Users,
Title = item.Username.Boost(3),
Tags = (BoostedValue) null,
Result = (object)item,
Query = string.Join(" ", item.FullName, item.Email)
});
Store(x => x.ObjectId, FieldStorage.Yes);
Store(x => x.ResultType, FieldStorage.Yes);
Store(x => x.Title, FieldStorage.Yes);
Store(x => x.Tags, FieldStorage.Yes);
Store(x => x.Result, FieldStorage.Yes);
Store(x => x.Query, FieldStorage.Yes);
}
}
编辑 2 下面是 Asset 和 User 模型(为简洁起见截断,因为它们只是一堆自动属性)
public class Asset : IHasId
{
public string Id { get; set; }
public Guid AssetId
{
get
{
Guid assetId;
Guid.TryParse((Id ?? string.Empty).Replace("assets/", ""), out assetId);
return assetId;
}
set { Id = "assets/" + value; }
}
public string Name { get; set; }
public string Description { get; set; }
}
public class User : IHasId
{
public User()
{
Status = UserStatus.Active;
}
public string Id { get; set; }
public int UserId
{
get
{
int userId;
int.TryParse((Id ?? string.Empty).Replace("users/", ""), out userId);
return userId;
}
set { Id = "users/" + value; }
}
public string Username { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public UserStatus Status { get; set; }
}
编辑 3 事实证明,当我单步执行代码时,该对象实际上是 Raven.Abstractions.Linq.DynamicJsonObject 类型,其中包含一个键值对数组。所以我想这个问题可能比 Json.NET 与 Raven 更相关。当然,除非有一个转换器可以从键值对转换为 json 对象。
【问题讨论】:
-
你能说明你是如何填充这个属性的吗?我猜你已经向它传递了一些字典。为什么不使用匿名对象?
-
我编辑了问题以显示它是如何完成的。它是通过 RavenDB 索引实现的。
-
您能展示一下您的
User和Asset模型吗?
标签: asp.net-mvc json.net ravendb