c# - json 字符串 : take only top level with JSON. NET 的部分序列化

标签 c# json serialization json.net

请为我澄清一些困惑:我有一个 JSON 字符串,我试图将其粘贴到一个对象中,但我只想进入顶层,并将下面的所有内容视为 blob 或字符串。像这样。

这是我的模型:

public class InputJson
{
    [JsonProperty(PropertyName = "signals")]
    public string signals{ get; set; }
    [JsonProperty(PropertyName = "options")]
    public string options { get; set; }
    [JsonProperty(PropertyName = "fields")]
    public string fields{ get; set; }
    [JsonProperty(PropertyName = "lapse")]
    public string lapse{ get; set; }
}

我正在尝试将 JSON 字符串(见下文)反序列化为它:

InputJson a = JsonConvert.DeserializeObject<InputJson>(body);

我希望 a.signals 会返回一个字符串,包含“signals”下方和“options”之前的所有内容,但它失败了,因为它试图继续并序列化它下方的所有内容。我得到一个 JsonReaderException:

Error reading string. Unexpected token: StartArray. Path 'signals', line 1, position 12.

我尝试使用 JsonSerializerSettings(比如将 maxDepth 设置为 1)但没有任何帮助。有人吗?

我的 JSON 字符串:

{
    "signals":
    [
        {
            "name":"1",
            "att1":"44",
            "att2":"0",
            "att3":"18",
            "size":10,
            "points":[-79,-29,-9,-23,27,-110,-39,-22,-32,-2]
        },
        {
            "name":"2",
            "att1":"46",
            "att2":"0",
            "att3":"12",
            "size":10,
            "points":[36,37,37,35,38,41,41,45,39,41]
        }
    ],
    "options":"opt1 opt2",
    "fields":"myfields",
    "lapse":"somelapse"
}

最佳答案

正如您正确推测的那样,您收到此错误是因为您的字段是字符串并且反序列化程序已找到一个数组。它不能将数组分配给字符串。

您可以通过对要视为“blob”的字段使用自定义 JsonConverter 来解决此问题,我假设您的意思是您只需要原始 JSON 字符串。

这是转换器所需的代码:

class BlobJsonConverter: JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(string));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        return token.ToString(Formatting.None);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

然后,在您的模型中,使用如下所示的 [JsonConverter] 属性装饰那些您希望视为“blob”的字符串属性:

public class InputJson
{
    [JsonProperty(PropertyName = "signals")]
    [JsonConverter(typeof(BlobJsonConverter))]
    public string signals { get; set; }

    [JsonProperty(PropertyName = "options")]
    public string options { get; set; }

    [JsonProperty(PropertyName = "fields")]
    public string fields { get; set; }

    [JsonProperty(PropertyName = "lapse")]
    public string lapse { get; set; }
}

现在,当您反序列化时,signals 将在“signals”下包含原始 JSON,而不是给出错误。

演示:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""signals"":
            [
                {
                    ""name"":""1"",
                    ""att1"":""44"",
                    ""att2"":""0"",
                    ""att3"":""18"",
                    ""size"":10,
                    ""points"":[-79,-29,-9,-23,27,-110,-39,-22,-32,-2]
                },
                {
                    ""name"":""2"",
                    ""att1"":""46"",
                    ""att2"":""0"",
                    ""att3"":""12"",
                    ""size"":10,
                    ""points"":[36,37,37,35,38,41,41,45,39,41]
                }
            ],
            ""options"":""opt1 opt2"",
            ""fields"":""myfields"",
            ""lapse"":""somelapse""
        }";

        InputJson a = JsonConvert.DeserializeObject<InputJson>(json);
        Console.WriteLine("signals: " + a.signals);
        Console.WriteLine("options: " + a.options);
        Console.WriteLine("fields: " + a.fields);
        Console.WriteLine("lapse: " + a.lapse);
    }
}

输出:

signals: [{"name":"1","att1":"44","att2":"0","att3":"18","size":10,"points":[-79,-29,-9,-23,27,-110,-39,-22,-32,-2]},{"name":"2","att1":"46","att2":"0","att3":"12","size":10,"points":36,37,37,35,38,41,41,45,39,41]}]
options: opt1 opt2
fields: myfields
lapse: somelapse

关于c# - json 字符串 : take only top level with JSON. NET 的部分序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24195336/

相关文章:

php - 使用PHP的Elasticsearch多个术语搜索Json Query构建器

c# - 如何在使用 Json.net 库将新记录写入现有的 json 文件时保持 json 文件格式有效?

json - 如何对原始的、未转义的 JSON 字符串进行编码?

java - 为什么序列化过程需要访问第一个不可序列化父类(super class)的无参数构造函数?

python - TypeError : an integer is required (got type _io. BufferedWriter) 使用 pickle

c# - 在两个数据集中寻找最佳匹配

c# - 无效操作异常

c# - 如何针对 Vista 测试应用程序

c# - 是否可以将两个相似的类函数包装到 C# 中的一个类中?

javascript - 在 Backbone 中使用 model.set 更改嵌套属性