Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# json字符串的部分序列化:仅采用json.NET的顶层_C#_Json_Serialization_Json.net - Fatal编程技术网

C# json字符串的部分序列化:仅采用json.NET的顶层

C# json字符串的部分序列化:仅采用json.NET的顶层,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,请为我澄清一些困惑:我有一个JSON字符串,我正试图将其粘贴到一个对象中,但我只想将其放在顶层,并将底层的所有内容视为一个blob或字符串。像这样的 这是我的模型: public class InputJson { [JsonProperty(PropertyName = "signals")] public string signals{ get; set; } [JsonProperty(PropertyName = "options")] public st

请为我澄清一些困惑:我有一个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);

正如您正确推测的那样,之所以会出现此错误,是因为您的字段是string,而反序列化程序发现了一个数组。它无法将数组分配给字符串

您可以通过使用自定义的
JsonConverter
来解决这个问题,因为您希望将字段视为“blob”,我假设您的意思是只需要原始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,而不是给出错误

演示:

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; }
}
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