为了账号安全,请及时绑定邮箱和手机立即绑定

将 JSON 作为资源加载到对象

将 JSON 作为资源加载到对象

C#
慕沐林林 2022-11-22 16:35:00

我有一个大的 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 回答

?
江户川乱折腾

TA贡献1553条经验 获得超4个赞

一种方法是反序列化 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()方法时,您可以添加一个空检查,如果找到了您要查找的值,就会显示一条消息。


查看完整回答
反对 回复 2022-11-22
?
RISEBY

TA贡献1575条经验 获得超5个赞

从这里:如何读取嵌入式资源文本文件

您可以使用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();

}

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


仅从文件名中获取 resourceName 的明智之举(通过命名空间的东西):


string resourceName = assembly.GetManifestResourceNames()

  .Single(str => str.EndsWith("YourFileName.txt"));

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


查看完整回答
反对 回复 2022-11-22
?
呼如林

TA贡献1526条经验 获得超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();

  }

}


查看完整回答
反对 回复 2022-11-22
?
慕标5832272

TA贡献1679条经验 获得超4个赞

声明一个类来模仿您的 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();

}


查看完整回答
反对 回复 2022-11-22
  • 4 回答
  • 0 关注
  • 15 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信