将byte[]解析为JsonObject而不转换为字符串

本文关键字:JsonObject 转换 字符串 byte | 更新日期: 2023-09-27 18:03:30

我有一个byte[],我想将其解析为JsonObject,但出于性能原因,我想避免将byte[]转换为string

这是我到目前为止得到的:

var byteTest = Encoding.ASCII.GetBytes("test".ToCharArray());
JsonSerializer serializer = new JsonSerializer();
JObject data;
using (MemoryStream ms = new MemoryStream(byteTest))
using (StreamReader streamReader = new StreamReader(ms))
{
   data = (JObject)serializer.Deserialize(streamReader, typeof(string));
}
return data;

但是我得到这个错误:Unexpected character encountered while parsing value: e. Path '', line 1, position 1.任何想法我怎么能正确地做到这一点?

将byte[]解析为JsonObject而不转换为字符串

c#文字"test"不是有效的JSON,因为它的计算结果是JSON文字test——没有引号。因为JSON字符串字面值必须加引号,所以必须这样做:

var byteTest = Encoding.ASCII.GetBytes("'"test'"");

接下来,serializer.Deserialize(streamReader, typeof(string));将返回一个 string ,不能强制转换为JObject。因此

这一行
data = (JObject)serializer.Deserialize(streamReader, typeof(string));

将生成一个InvalidCastException

如果出于某种原因您需要将反序列化的string(或任何反序列化的POCO)重新序列化为LINQ-to-JSON层次结构,您可以使用JToken.FromObject():

using (MemoryStream ms = new MemoryStream(byteTest))
    using (StreamReader streamReader = new StreamReader(ms))
    {
        var value = serializer.Deserialize(streamReader, typeof(string));
        token = JToken.FromObject(value, serializer);
    }

或者如果你真的只需要直接从流加载一个linq到json的层次结构,使用JToken.ReadFrom:

using (var ms = new MemoryStream(byteTest))
    using (var streamReader = new StreamReader(ms))
        using (var jsonReader = new JsonTextReader(streamReader))
        {
            token = JToken.ReadFrom(jsonReader);
        }

这里JToken是一个抽象基类,可以表示JSON标准中的任何数据类型(对象、数组、值、字符串、数字)。不能使用JObject,因为字符串值实际上会被序列化为JValue而不是JObject