我有一个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.
任何想法我怎么能正确地做到这一点?
答案 0 :(得分:2)
c#literal "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-to-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 Standard的任何数据类型(对象,数组,值,字符串,数字)。无法使用JObject
,因为字符串值实际上会被序列化为JValue
而不是JObject
。