【问题标题】:Deserialize JSON object property to string将 JSON 对象属性反序列化为字符串
【发布时间】:2015-05-01 01:54:58
【问题描述】:

我有一些 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 - How to deserialize JSON to object but treating a property as a string instead of JSON?

【问题讨论】:

    标签: c# json serialization json.net


    【解决方案1】:

    出于我的需要,我决定继续实现自定义 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 数据被存储为一个字符串。所以现在一切都很好。我发现以下对实施很有帮助:How to deserialize a JSON property that can be two different data types using Json.NET

    更新:修改 WriteJson 方法以序列化为 JSON 对象(不是字符串)。

    【讨论】:

    • 如果您在类或属性上使用[JsonConverter] 属性,则不会调用CanConvert 方法,因为Json.Net 已经知道您的转换器可以处理该类型。 (您通过添加属性告诉它。)如果您不使用[JsonConverter] 属性,而是通过设置将转换器实例传递给序列化程序,则会调用CanConvert。在这种情况下,Json.Net 必须询问转换器是否可以处理遇到的每种类型。因此,您可能希望 CanConvert 方法为您的转换器设计处理的对象类型返回 true。
    • 太棒了。这拯救了我的一天。如果 json 是数组的一部分,您可以通过例如增强 ReadJson() else if (token.Type == JTokenType.Array) { List objList = token.ToObject>();返回 objList.Select(item => item.ToString()).ToList(); }
    【解决方案2】:

    您也可以为属性使用JToken 类型,以指示任何有效的JSON 都可以到达那里。虽然这不完全符合您的要求,但可能就足够了。

    public class MyClass
    {
        public string SimpleProperty { get; set; }
        public JToken Json { get; set; }
    }
    

    然后执行myClass.Json.ToString() 将获得JSON 作为string

    【讨论】:

    • 谢谢,但不幸的是,这不适用于我的用例,因为需要在现有框架的上下文中使用该类,该框架需要使用该类并对其进行处理。跨度>
    猜你喜欢
    • 2021-01-12
    • 2017-05-03
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2014-01-04
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多