加载JSON作为对象的资源

问题描述 投票:-1回答:4

我有一个大型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");

任何建议都会非常受欢迎。谢谢

c#
4个回答
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();
  }
}

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
投票

一种方法是反序列化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
投票

声明一个类来模仿您的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();
}
© www.soinside.com 2019 - 2024. All rights reserved.