Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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.NET反序列化多个json字符串的最快方法_C#_Json.net - Fatal编程技术网

C# 使用json.NET反序列化多个json字符串的最快方法

C# 使用json.NET反序列化多个json字符串的最快方法,c#,json.net,C#,Json.net,随着时间的推移,我将检索多个json数据块,并使用json.NET对它们进行反序列化。我创建的对象反映了每个不同数据块的结构,但当接收到每个数据块时,我将无法检测到类型 我希望避免尝试对每种类型进行反序列化,在抛出异常时捕获失败并继续下一种类型。这样做显然对性能不利 有没有一种快速有效的方法来确定json消息的结构并对其进行反序列化?使用JObjectJsonConvert.DeserializeObject的唯一方法。。。然后深入结构检查是否存在某些子级,然后使用JsonConvert.Des

随着时间的推移,我将检索多个json数据块,并使用json.NET对它们进行反序列化。我创建的对象反映了每个不同数据块的结构,但当接收到每个数据块时,我将无法检测到类型

我希望避免尝试对每种类型进行反序列化,在抛出异常时捕获失败并继续下一种类型。这样做显然对性能不利


有没有一种快速有效的方法来确定json消息的结构并对其进行反序列化?使用JObjectJsonConvert.DeserializeObject的唯一方法。。。然后深入结构检查是否存在某些子级,然后使用JsonConvert.DeserializeObject。。。?将对象反序列化两次似乎效率低下。

您可以控制两个端点吗?如果是这样的话,为什么不简单地“咀嚼”回答,告诉你使用哪种模型呢

SomeObjectModel|{SomeObjectModelProperty:'Value',AnotherProperty:'Value2'}

您拆分并确定SomeObjectModel是将其余部分反序列化到的类型

您可以控制两个端点吗?如果是这样的话,为什么不简单地“咀嚼”回答,告诉你使用哪种模型呢

SomeObjectModel|{SomeObjectModelProperty:'Value',AnotherProperty:'Value2'}

您拆分并确定SomeObjectModel是将其余部分反序列化到的类型

您说过,试错反序列化显然对性能不利。你量过这个了吗?反序列化程序是否需要很长时间才能确定其类型是否错误?它可能不雅观,但可能没有那么贵

根据您的度量,您可能能够对JSON数据的开头进行部分字符串比较,并将分支转换为正确的类型,并将反复试验作为备用方法


但是,您可能会发现,如果您尝试按最可能出现的类型反序列化,那么您可能会发现反序列化速度足够快,而无需进行额外的比较。

您指出,尝试和错误反序列化显然会对性能造成不利影响。你量过这个了吗?反序列化程序是否需要很长时间才能确定其类型是否错误?它可能不雅观,但可能没有那么贵

根据您的度量,您可能能够对JSON数据的开头进行部分字符串比较,并将分支转换为正确的类型,并将反复试验作为备用方法


但是,您可能会发现,如果您尝试按最有可能发生的类型反序列化,那么您可能会发现反序列化速度足够快,而无需进行额外的比较。

我没有对此进行广泛的测试,但类似的测试应该可以做到这一点:

object MyDeserialize(string s) {
    using (var jr = new JsonTextReader(new StringReader(s)))
    {
        if (jr.Read() && jr.TokenType == JsonToken.StartObject) {
            while (jr.Read() && jr.TokenType == JsonToken.PropertyName) {
                switch ((string)jr.Value)
                {
                    case "MagicKey1": return JsonConvert.DeserializeObject<MagicType1>(s);
                    case "MagicKey2": return JsonConvert.DeserializeObject<MagicType2>(s);
                }
                jr.Skip();
            }
            if (jr.TokenType != JsonToken.EndObject)
                throw new ArgumentException("Expected end object");
            throw new ArgumentException("Couldn't determine object type");
        }
        else
            throw new ArgumentException("Expected start object");
    }
}

void Main() {
    var s = "{ \"MagicKey1\": [], \"b\": \"asdaasd\", \"c\": { \"a\": 5 } }";
    MyDeserialize(s);
}

我没有对此进行广泛的测试,但类似这样的测试应该可以做到:

object MyDeserialize(string s) {
    using (var jr = new JsonTextReader(new StringReader(s)))
    {
        if (jr.Read() && jr.TokenType == JsonToken.StartObject) {
            while (jr.Read() && jr.TokenType == JsonToken.PropertyName) {
                switch ((string)jr.Value)
                {
                    case "MagicKey1": return JsonConvert.DeserializeObject<MagicType1>(s);
                    case "MagicKey2": return JsonConvert.DeserializeObject<MagicType2>(s);
                }
                jr.Skip();
            }
            if (jr.TokenType != JsonToken.EndObject)
                throw new ArgumentException("Expected end object");
            throw new ArgumentException("Couldn't determine object type");
        }
        else
            throw new ArgumentException("Expected start object");
    }
}

void Main() {
    var s = "{ \"MagicKey1\": [], \"b\": \"asdaasd\", \"c\": { \"a\": 5 } }";
    MyDeserialize(s);
}

甚至在我发布问题之前,我就有一种印象,那就是没有一种明显更优雅的方式来处理这种情况。我决定进行双重反序列化。我认为这并不理想,但我想还没有更好/更干净的办法


谢谢你的回答。

甚至在我发布问题之前,我就有一种印象,那就是没有一种明显更优雅的方式来处理这种情况。我决定进行双重反序列化。我认为这并不理想,但我想还没有更好/更干净的办法


谢谢你的回答。

不幸的是,我没有。我正在使用其他人的数据。不幸的是,我没有。我正在使用其他人的数据。此JSON的制作者是否能够进行更改以满足您的需要?不。JSON结构必须保持原样。此JSON的制作者是否能够进行更改以满足您的需要?不。JSON结构必须保持原样。我没有特意测量性能,而且可能不会很昂贵,但是我的代码是为一个库编写的,所以它可能会被用于经常碰到代码的场景中,所以我希望尽可能地减少它。这个问题其实是在寻找想法,而不是解决一个已知的问题。@Ricky-因为你需要知道反序列化的类型,你要么必须捕获异常,要么事先检查JSON字符串。我没有特意去衡量性能,而且可能不贵,但我的代码是用于库的,因此,它有可能被用于经常碰到代码的场景中,所以我希望尽可能地减少它。这个问题其实是在寻找思路,而不是解决一个已知的问题。@Ricky-因为您需要知道要反序列化到的类型,所以您必须捕获异常或事先检查JSON字符串。