将JSON作为资源加载到对象

时间:2019-04-02 13:46:32

标签: c#

我有一个大的JSON文件,我想将其加载到我的项目中。然后,我想搜索名称并返回类型。下面的示例:

[
  {
    "Name": "Name1",
    "Type": "TypeA"
  },
  {
    "Name": "Name2",
    "Type": "TypeB"
  }
]

我的问题是我不确定什么是最好的方法。我应该创建一个对象类,然后将文件加载到其中吗?

我一直试图通过从我的资源中加载它来做到这一点。我似乎无法做到这一点,或者找不到其他这样做的例子,这使我相信我做错了方法。我尝试如下:

var resourceName = FS.Properties.Resources.types;
dynamic jsonDe = JsonConvert.DeserializeObject<TypeList>(resourceName);

dynamic jsonDe = JsonConvert.DeserializeObject<TypeList>("FS.Resources.types.json");

任何建议都将受到欢迎。谢谢

4 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是反序列化Json文件并将其存储在数据类中。 将Json文件转换为包含该信息的数据类对象的列表时,可以使用Linq搜索属性的给定值。

请参阅以下链接以反序列化JSON文件Deserialize Json From File.

Linq查询如下所示。

arrayList.where(w => w.propertyName == "value of string").select(s => s.propertyName).

可以使用.ToList()检索匹配属性的列表,也可以使用单个属性.First()检索。

请注意,如果找不到匹配的值,.First()将引发异常。可以使用.FirstOrDefault(),这将返回没有匹配值的空值。

使用.FirstOrDefault()方法时,可以添加一个空检查,如果找到了您要查找的值,则会显示一条消息。

答案 1 :(得分:2)

从这里:How to read embedded resource text file

您可以使用Assembly.GetManifestResourceStream方法:

添加以下用途     使用System.IO;     使用System.Reflection;

设置相关文件的属性: 参数Build Action的值为Embedded Resource

使用以下代码

var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyCompany.MyProduct.MyFile.txt";

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
    string result = reader.ReadToEnd();
}

resourceNameassembly中嵌入的资源之一的名称。例如,如果您将一个名为"MyFile.txt"的文本文件嵌入到具有默认命名空间"MyCompany.MyProduct"的项目的根目录中,则resourceName为"MyCompany.MyProduct.MyFile.txt".。您可以在其中获取所有资源的列表。程序集使用Assembly.GetManifestResourceNames方法。

毫不费吹灰之力地仅从文件名中获取resourceName(通过传递名称空间的东西):

string resourceName = assembly.GetManifestResourceNames()
  .Single(str => str.EndsWith("YourFileName.txt"));

之后,您可以使用thisthis (以前由用户建议)来反序列化您的值。

答案 2 :(得分:1)

声明一个类来模仿您的JSON结构是一种选择:

sealed class MyType
{
    public string Name { get; set; }
    public string Type { get; set; }
}

然后,您将可以在类型列表中反序列化它并根据给定名称进行过滤

private static string FindType(string json, string name)
{
    return JsonConvert.DeserializeObject<List<MyType>>(json)
                      .SingleOrDefault(nt => nt.Name == name)?
                      .Type ?? "No type found";
}

请注意,此方法评估找不到给定名称的记录,在这种情况下,它将返回默认字符串。

如果要对资源文件使用此方法:

static void Main(string[] args)
{
    Console.WriteLine(FindType(FS.Properties.Resources.types, "Name1")); //prints "Type1
    Console.WriteLine(FindType(FS.Properties.Resources.types, "name1")); //prints "No type found
    Console.ReadKey();
}

答案 3 :(得分:1)

我认为这是最干净,最易懂的解决方案:

public class Program
{
  public class MappedObject
  {
    public string Name { get; set; }
    public string Type { get; set; }
  }

  public static void Main(string[] args)
  {
    // search query
    string searchFor = "Name1";
    // our json
    string jsonData = "[{\"Name\": \"Name1\",\"Type\": \"TypeA\"},{\"Name\": \"Name2\",\"Type\": \"TypeB\"}]";
    // I'm mapping the json string into a list of MappedObject (s)
    List<MappedObject> mappedObjects = JsonConvert.DeserializeObject<List<MappedObject>>(jsonData);

    // I'm looping through this list to find the MappedObject
    // that matches the searchFor search query string
    foreach (MappedObject obj in mappedObjects)
    {
      if (obj.Name == searchFor)
      {
        // when I find it, I'll print the Type property
        Console.WriteLine(obj.Type);
      }
    }

    Console.ReadLine();
  }
}

如果您想从外部资源(例如.json文件)中读取json,可以执行以下操作:

public class Program
{
  public class MappedObject
  {
    public string Name { get; set; }
    public string Type { get; set; }
  }

  public static void Main(string[] args)
  {
    // search query
    string searchFor = "Name1";

    using (StreamReader r = new StreamReader("file.json"))
    {
      // our json read from file.json
      string jsonData = r.ReadToEnd();
      // I'm mapping the json string into a list of MappedObject (s)
      List<MappedObject> mappedObjects = JsonConvert.DeserializeObject<List<MappedObject>>(jsonData);

      // I'm looping through this list to find the MappedObject
      // that matches the searchFor search query string
      foreach (MappedObject obj in mappedObjects)
      {
        if (obj.Name == searchFor)
        {
          // when I find it, I'll print the Type property
          Console.WriteLine(obj.Type);
        }
      }
    }

    Console.ReadLine();
  }
}