将 JSON 对象 属性 反序列化为字符串
Deserialize JSON object property to string
我有一些 JSON 具有多种属性,其中大部分是简单数据类型。但是,我在 JSON 中有一个 属性,当我将它反序列化为 C# class 时,我只需要将它反序列化为一个字符串。
示例JSON:
{"simpleProperty": "value1", "json":{"a":"a1", "b":"b1"}}
"json" 对象除了将是一个有效的 JSON 对象之外没有固定结构。
所以在上面的例子中 "json" 的值是一个 JSON 对象——但是当它被反序列化时,我需要它作为一个字符串。
所以如果我的 C# class 是:
public class MyClass
{
public string SimpleProperty { get; set; }
public string Json { get; set; }
}
然后如果我使用:
var myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
我希望 myClass.Json 只是一个简单的字符串。
我考虑过为此创建一个自定义 JsonConverter,但对于这么简单的事情来说,这似乎太复杂了。我一定是在这里遗漏了什么。任何方向将不胜感激。
我也看到了这个 post -- 但它确实没有回答问题:JSON.Net - How to deserialize JSON to object but treating a property as a string instead of 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 方法,因为它似乎从未被调用过,但它似乎进行了转换,然后允许我存储反序列化的 class 到 MongoDB 和 JSON 数据正在存储一个字符串。所以现在一切都很好。我发现以下内容有助于实施:How to deserialize a JSON property that can be two different data types using Json.NET
更新:修改 WriteJson 方法以序列化为 JSON 对象(不是字符串)。
我有一些 JSON 具有多种属性,其中大部分是简单数据类型。但是,我在 JSON 中有一个 属性,当我将它反序列化为 C# class 时,我只需要将它反序列化为一个字符串。
示例JSON:
{"simpleProperty": "value1", "json":{"a":"a1", "b":"b1"}}
"json" 对象除了将是一个有效的 JSON 对象之外没有固定结构。
所以在上面的例子中 "json" 的值是一个 JSON 对象——但是当它被反序列化时,我需要它作为一个字符串。
所以如果我的 C# class 是:
public class MyClass
{
public string SimpleProperty { get; set; }
public string Json { get; set; }
}
然后如果我使用:
var myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
我希望 myClass.Json 只是一个简单的字符串。
我考虑过为此创建一个自定义 JsonConverter,但对于这么简单的事情来说,这似乎太复杂了。我一定是在这里遗漏了什么。任何方向将不胜感激。
我也看到了这个 post -- 但它确实没有回答问题:JSON.Net - How to deserialize JSON to object but treating a property as a string instead of 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 方法,因为它似乎从未被调用过,但它似乎进行了转换,然后允许我存储反序列化的 class 到 MongoDB 和 JSON 数据正在存储一个字符串。所以现在一切都很好。我发现以下内容有助于实施:How to deserialize a JSON property that can be two different data types using Json.NET
更新:修改 WriteJson 方法以序列化为 JSON 对象(不是字符串)。