将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.
任何想法我怎么能正确地做到这一点?
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
。