我有一个大的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");
任何建议都将受到欢迎。谢谢
答案 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();
}
resourceName
是assembly
中嵌入的资源之一的名称。例如,如果您将一个名为"MyFile.txt"
的文本文件嵌入到具有默认命名空间"MyCompany.MyProduct"
的项目的根目录中,则resourceName为"MyCompany.MyProduct.MyFile.txt".
。您可以在其中获取所有资源的列表。程序集使用Assembly.GetManifestResourceNames方法。
毫不费吹灰之力地仅从文件名中获取resourceName(通过传递名称空间的东西):
string resourceName = assembly.GetManifestResourceNames()
.Single(str => str.EndsWith("YourFileName.txt"));
答案 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();
}
}