2016-10-01 27 views
0

プロジェクトの埋め込みリソースにファイルJsonを追加しました。 特定のオブジェクトのリストを含むこのファイルを読み込み、それを逆シリアル化したいと思います。オブジェクトの配列へのjsonオブジェクトのデシリアライズ

私は、次のようなJSONファイルを持っている:

[ 
    { 
     "Status": 21, 
     "CustomerId": "e3633ccb-bbea-465d-9ce6-6c37e9c40e2e" 
    }, 
    { 
     "Status": 20, 
     "CustomerId": "d02e2970-7c28-41b0-89f3-5276a97e12c9" 
    } 
] 

と、次のモデルは:

public class CustomerStatus 
{ 
    public int Status { get; set; } 
    public string CustomerId { get; set; } 
} 

私はリソースからJSONファイルを読み込むと、それはバイトの配列の形式で自動的にあると私は変換して文字列には、\ r \ nと\ tが含まれています。私はラインを次している私のコードで
はこれを達成するため行うが、それは失敗します。

var string customerdata = System.Text.Encoding.UTF8.GetString(myResources.CustomerStatus); 
var data = JsonConvert.DeserializeObject<List<CustomerStatus>>(customerdata); 

私はこのエラーが表示されます。 は値を解析中に「Newtonsoft.Json.JsonReaderException」メッセージ」予期しない文字が遭遇したタイプの例外を投げました: 。パス ''、行0、位置0。

UPDATE:

次の行にも同じ問題を引き起こす:

var string customerdata = System.Text.Encoding.UTF8.GetString(myResources.CustomerStatus); 
    .Replace("\r\n", " ") 
    .Replace("\t", " "); 
+2

ファイルの先頭にバイトオーダーのマークがあり、それが文字列に終わると思います。 'customerdata'の最初の文字の文字コードが0xFEFFかどうか確認してください。 –

答えて

1

ファイルのエンコードに問題があるようです。メモ帳++を使用してファイルを変換するか、メモ帳を使用してJSONファイルを開き、[名前を付けて保存]を使用してANSIをエンコーディングとして選択できます。その後、代わりにファイルを変換するために、メモ帳+ +を使用し、その後、削除して、あなたのリソースに再度ファイルを追加し、あなたがUTF8を使用することを熱望している場合 System.Text.Encoding.UTF8.GetString(myResources.CustomerStatus)

System.Text.Encoding.ASCII.GetString(myResources.CustomerStatus)

を切り替えます。

+0

超!それは解決される!ありがとう! –

1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web; 
using System.Web.Script.Serialization; 

namespace ConsoleApplication16 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string customerdata = 
       "[" + 
        "{" + 
         "\"Status\": 21," + 
         "\"CustomerId\": \"e3633ccb-bbea-465d-9ce6-6c37e9c40e2e\"" + 
        "}," + 
        "{" + 
         "\"Status\": 20," + 
         "\"CustomerId\": \"d02e2970-7c28-41b0-89f3-5276a97e12c9\"" + 
        "}" + 
       "]"; 

      JavaScriptSerializer ser = new JavaScriptSerializer(); 
      var r = ser.Deserialize<List<CustomerStatus>>(customerdata); 

     } 

    } 
    public class CustomerStatus 
    { 
     public int Status { get; set; } 
     public string CustomerId { get; set; } 
    } 
} 
+0

私はリソースにファイルを置くことがもっときれいで読みやすいと思った。なぜそれが失敗するか知っていますか? –

0

埋め込みリソースについては、以下のアプローチを試してみてくださいネットライブラリのメソッドを使用してみてください:

using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Reflection; 

namespace StackOverflowTests { 
    class Program { 
    static void Main(string[] args) { 
     var assembly = Assembly.GetExecutingAssembly(); 
     var resource = "StackOverflowTests.StatusCustomer.json"; 

     var deserializedResource = GetEmbeddedResource<List<CustomerStatus>>(assembly, resource); 

     Console.WriteLine(JsonConvert.SerializeObject(deserializedResource)); 
     Console.ReadKey(); 
    } 

    private static T GetEmbeddedResource<T>(Assembly assembly, string resource) { 
     using (Stream manifestStream = assembly.GetManifestResourceStream(resource)) 
     using (StreamReader reader = new StreamReader(manifestStream)) { 
     string result = reader.ReadToEnd(); 
     return JsonConvert.DeserializeObject<T>(result); 
     } 
    } 

    public class CustomerStatus { 
     public int Status { get; set; } 
     public string CustomerId { get; set; } 
    } 
    } 
} 
あなたはカント使用

System.Text.Encoding.UTF8.GetString(myResources.CustomerStatus) 

呼び出した後のアプローチ、ポストシリアライズされた文字列を記述した場合

ので、私は間違っているものを見ることができます。

関連する問題