将json对象解析为对象数组

时间:2016-10-01 10:18:54

标签: c# 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 \ .t。 在我的代码中我有以下行来实现这一点,但它失败了:

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

我收到此错误: 抛出了类型&#39; Newtonsoft.Json.JsonReaderException&#39;消息&#34;解析值时遇到意外的字符:。路径&#39;&#39;,第0行,第0位。&#34;

更新

以下行也会产生同样的问题:

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

3 个答案:

答案 0 :(得分:1)

尝试使用Net Library方法

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; }
    }
}

答案 1 :(得分:1)

这似乎是文件的编码问题。您可以使用Notepad ++转换文件,也可以使用记事本打开JSON文件,并使用另存为选择ANSI作为编码。然后在资源中再次删除并添加文件并切换 System.Text.Encoding.UTF8.GetString(myResources.CustomerStatus)

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

如果您热衷于使用UTF8,请使用Notepad ++转换文件。

答案 2 :(得分: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)

打电话,所以我可以看出出了什么问题。