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

时间:2016-08-22 14:51:57

标签: c# json json.net

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

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