亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 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貢獻1851條經驗 獲得超5個贊

一種方法是反序列化 Json 文件并將其存儲在數據類中。當 Json 文件轉換為包含信息的數據類對象列表時,可以使用 Linq 搜索屬性的給定值。

請參閱以下鏈接以反序列化 JSON 文件Deserialize Json From File。

Linq 查詢如下所示。

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

.ToList()如果您需要單個屬性,則可以使用 或 檢索匹配屬性的列表.First()。

請注意,.First()當找不到匹配值時會拋出異常??梢允褂?code>.FirstOrDefault(),這會返回一個空值,因為沒有匹配值。

使用該.FirstOrDefault()方法時,您可以添加一個空檢查,如果找到了您要查找的值,就會顯示一條消息。


查看完整回答
反對 回復 2022-11-22
?
RISEBY

TA貢獻1856條經驗 獲得超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貢獻1798條經驗 獲得超3個贊

我認為這是最干凈、最容易理解的解決方案:


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貢獻1966條經驗 獲得超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 關注
  • 154 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號