2016-08-22 4 views
1

私はbyte[]を持っていますが、それをJsonObjectとして解析したいのですが、性能上の理由からbyte[]stringに変換しないでください。文字列に変換せずにbyte []をJsonObjectに解析する

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.私はこれを正しく行うことができますどのように任意のアイデア?

+4

これは有効なJSONではありません。 – SLaks

+0

あなたは@SLaksが何を意味するか分かりません。私はバイト[]からjsonを作成しようとしています –

+0

ある時点では、jsonはテキストベースの形式なので、それはテキストに変換されます。この努力を避けることを提案するでしょう。 –

答えて

1

C#リテラル"test"は、JSONリテラルtest(引用符なし)と評価されるため、有効なJSONではありません。リテラルJSON文字列を引用符で囲む必要がありますので、あなたが行う必要があります。

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

次に、serializer.Deserialize(streamReader, typeof(string));JObjectにキャストすることはできませんstringを、返します。したがって、ライン

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

InvalidCastExceptionを生成します。

 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階層にstringを非直列化(または任意のは、POCOを直列化復元)シリアライズを再する必要がある場合は

、あなたはJToken.FromObject()使用することができますストリームから直接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 Standardから。 JObjectではなく、文字列値が実際にJValueにシリアル化されるため、JObjectは使用できません。

関連する問題