我有一些JSON,它具有各种属性,其中大多数是简单的数据类型。 但是,我在 JSON 中有一个属性,当我将其反序列化为 C# 类时,我只需要将其反序列化为字符串。
示例 JSON:
{"simpleProperty": "value1", "json":{"a":"a1", "b":"b1"}}
"json"对象没有设置结构,除了它是一个有效的JSON对象。
所以在上面的例子中,"json"的值是一个JSON对象——但是当它被反序列化时,我需要它作为一个字符串。
因此,如果我的 C# 类是:
public class MyClass
{
public string SimpleProperty { get; set; }
public string Json { get; set; }
}
然后如果我使用:
var myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
我希望myClass.Json只是一个简单的字符串。
我已经考虑为此创建自定义 JsonConverter,但对于这么简单的事情来说,这似乎太复杂了。我一定在这里错过了什么。 任何方向将不胜感激。
我也看到了这篇文章 - 但它真的没有回答这个问题:JSON.Net - 如何将 JSON 反序列化为对象,但将属性视为字符串而不是 JSON?
使用属性的JToken
类型,以指示任何有效的 JSON 都可以转到那里。 虽然这不是你所要求的,但可能就足够了。
public class MyClass
{
public string SimpleProperty { get; set; }
public JToken Json { get; set; }
}
执行myClass.Json.ToString()
操作将使JSON作为string
。
为了满足我的需求,我决定继续实现一个自定义的 JsonConverter,如下所示:
class JsonConverterObjectToString : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(JTokenType));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
{
return token.ToString();
}
return null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
//serializer.Serialize(writer, value);
//serialize as actual JSON and not string data
var token = JToken.Parse(value.ToString());
writer.WriteToken(token.CreateReader());
}
}
我还没有彻底测试上述实现,也不完全确定 Canconvert 方法,因为它似乎从未被调用过,但它似乎进行了转换,然后允许我将反序列化的类存储到 MongoDB 中,JSON 数据存储为字符串。 所以现在一切都很好。我发现以下内容在实现中很有帮助:如何使用 Json.NET 反序列化可以是两种不同数据类型的 JSON 属性
更新:修改了 WriteJson 方法以序列化回 JSON 对象(而不是字符串)。