所以这是我的情况.我正在WebForms应用程序中实现一个WEB API.我有一堆动态类,它们本质上是字典,需要使用自定义JSON序列化格式化程序才能正常工作(因为默认转换器只显示一堆键值配对).
所以首先我创建了一个自定义JSON转换器:
/// <summary>
/// A class to convert entities to JSON
/// </summary>
public class EntityJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsSubclassOf(typeof(Entity));
}
public override bool CanRead
{
get { return true; }
}
public override bool CanWrite
{
get { return true; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// Details not important. This code is called and works perfectly.
}
public override object ReadJson(JsonReader reader, Type …Run Code Online (Sandbox Code Playgroud) 我正在使用Json.NET包含Guid类型的私有字段和该字段的公共属性的对象反序列化.当Guid我的json中的值为null时,我想分配Guid.Empty给我的字段.
public class MyClass
{
private Guid property;
public Guid Property
{
get { return property; }
set
{
if (value == null)
{
property = Guid.Empty;
}
else
{
property = value;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是deserializer想要访问私有字段,导致我在尝试反序列化时遇到此错误:
将值{null}转换为类型'System.Guid'时出错.路径'[0] .property',第6行,第26位.
如何让它忽略私有字段并使用公共属性呢?
我有一组动态数据.我想这样回来:
{
_id: "58b454f20960a1788ef48ebb"
...
}
Run Code Online (Sandbox Code Playgroud)
以下列出了不起作用的方法:
这个
await resources = _database.GetCollection<BsonDocument>("resources")
.Find(Builders<BsonDocument>.Filter.Empty)
.ToListAsync();
return Ok(resources);
Run Code Online (Sandbox Code Playgroud)
产量
[[{"name":"_id","value":{"bsonType":7,"timestamp":1488213234,"machine":614561,"pid":30862,"increment":16027323,"creationTime":"2017-02-27T16:33:54Z","rawValue":{"timestamp":1488213234,"machine":614561,"pid":30862,"increment":16027323,"creationTime":"2017-02-27T16:33:54Z"},"value":{"timestamp":1488213234,"machine":614561,"pid":30862,"increment":16027323,"creationTime":"2017-02-27T16:33:54Z"}}}]]
Run Code Online (Sandbox Code Playgroud)
这个
await resources = _database.GetCollection<BsonDocument>("resources")
.Find(Builders<BsonDocument>.Filter.Empty)
.ToListAsync();
return Ok(resources.ToJson());
Run Code Online (Sandbox Code Playgroud)
产量
[{ "_id" : ObjectId("58b454f20960a1788ef48ebb"), ... }]
Run Code Online (Sandbox Code Playgroud)
这个
await resources = _database.GetCollection<BsonDocument>("resources")
.Find(Builders<BsonDocument>.Filter.Empty)
.ToListAsync();
return Ok(resources.ToJson(new JsonWriterSettings() { OutputMode = JsonOutputMode.Strict }));
Run Code Online (Sandbox Code Playgroud)
产量
[{ "_id" : { "$oid" : "58b454f20960a1788ef48ebb" }, ... }]
Run Code Online (Sandbox Code Playgroud)
这个
await resources = _database.GetCollection<BsonDocument>("resources")
.Find(Builders<BsonDocument>.Filter.Empty)
.ToListAsync();
return Ok(Newtonsoft.Json.JsonConvert.SerializeObject(resources));
Run Code Online (Sandbox Code Playgroud)
产量
"Newtonsoft.Json.JsonSerializationException:在'MongoDB.Bson.BsonObjectId'上从'AsBoolean'获取值时出错.---> System.InvalidCastException:无法将类型为'MongoDB.Bson.BsonObjectId'的对象强制转换为'MongoDB.Bson .BsonBoolean"
并BsonDocument改为dynamic产生相同的结果. …
在另一个类中使用时,如何实现Id类的以下JSON表示形式?
class Car
{
public StringId Id { get; set; }
public string Name { get; set; }
}
class StringId
{
public string Value { get; set; }
}
// ---------------------------------------------
// Desired representation
{ "Id": "someId", "Name": "Ford" }
// Default (undesired) representation
{ "Id" : { "Value": "someId" }, "Name": "Ford" }
Run Code Online (Sandbox Code Playgroud)