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()
当找不到匹配值时会抛出异常。可以使用.FirstOrDefault()
,这会返回一个空值,因为没有匹配值。
使用该.FirstOrDefault()
方法时,您可以添加一个空检查,如果找到了您要查找的值,就会显示一条消息。
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"));
之后,您可以使用这个或这个 (之前由用户建议)来反序列化您的值。
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();
}
}
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();
}
- 4 回答
- 0 关注
- 121 浏览
添加回答
举报