Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Newtonsoft.json-mapped到C#.net模型读取json的另一种方法_C#_Json_Json.net - Fatal编程技术网

使用Newtonsoft.json-mapped到C#.net模型读取json的另一种方法

使用Newtonsoft.json-mapped到C#.net模型读取json的另一种方法,c#,json,json.net,C#,Json,Json.net,抱歉没有为我的帖子提供最佳/合适的标题,如果你有比我更好的标题,我很乐意更新 我目前的问题是,我必须处理使用Newtonsoft.JSON的现有代码,该代码从.JSON文件(从第三方源代码提供)读取JSON。它也映射到现有的类。我不确定这是否是正确的方法,只需执行if-ELSE就可以到达正确的json节点,也许有人会有其他选择/比我更好的方法。多谢各位 这不是确切的代码,但我复制了与我的问题相关的代码 PET.JSON文件:(JSON文件由第三方提供,结构/模式与下面的示例相同,是他们的格式,因

抱歉没有为我的帖子提供最佳/合适的标题,如果你有比我更好的标题,我很乐意更新

我目前的问题是,我必须处理使用Newtonsoft.JSON的现有代码,该代码从.JSON文件(从第三方源代码提供)读取JSON。它也映射到现有的类。我不确定这是否是正确的方法,只需执行if-ELSE就可以到达正确的json节点,也许有人会有其他选择/比我更好的方法。多谢各位

这不是确切的代码,但我复制了与我的问题相关的代码

PET.JSON文件:(JSON文件由第三方提供,结构/模式与下面的示例相同,是他们的格式,因为没有更改JSON格式的权限)

Pet类和子类(这是第三方标准结构,我没有修改它的权限)

公共级宠物
{
公狗{get;set;}
公共鸟类{get;set;}
公家犬{
公共布尔值{get;set;}
公共整数{get;set;}
}
公鸡
{
公共布尔值{get;set;}
公共整数{get;set;}
}
}  
Pet阅读器(我需要使用映射到上述模型的反序列化Json对象,但我还没有修改其实现的权限,我必须自己管理如何使用ReadPetJSON()的返回值)

publicstaticpetreadpetjson()
{
字符串JSON_TEXT=File.ReadAllText(“PET.JSON”);
Pet Pet=Newtonsoft.Json.JsonConvert.DeserializeObject(Json_文本);
归还宠物;
}  
更新: 我发现了如何使用反射,我可以传递一个变量名来查找PropertyName。感谢大家的帮助和投入,我对此表示感谢

//使用反射
Pet=ReadPetJSON();
//使用“点”分隔符搜索鸟>脚
string searchBy=“bird.feet”
foreach(searchBy.Split('.')中的字符串部分)
{
如果(pet==null){返回null;}
Type=pet.GetType();
PropertyInfo=type.GetProperty(部分);
如果(info==null){return null;}//或捕获NullException
pet=info.GetValue(pet,null);
}
var result=pet.ToString();//对象生成字符串
WriteLine(“鸟脚:{0}”,结果);
输出:

Bird-Feet: 2
我是这样想的,但我知道这是不可能的

是的,是的,通过下面的代码它是可能的

您必须
查询
您的json

string JSON_TEXT = File.ReadAllText("PET.JSON");

JObject jObject = JObject.Parse(JSON_TEXT);

//This is your search term
string search = "Dog";  //or "Bird", or "Lion", or "Tiger", or "Eagle" or anything that are present it your json

bool cute = (bool)jObject["Pet"][search]["cute"];
int feet = (int)jObject["Pet"][search]["feet"];

string temp = $"My {search} is cute = {cute} and feet = {feet} ";

//If you want it in your strongly type then
Dog dog = jObject["Pet"][search].ToObject<Dog>();
Bird bird = jObject["Pet"][search].ToObject<Bird>();
string JSON_TEXT=File.ReadAllText(“PET.JSON”);
JObject=JObject.Parse(JSON_文本);
//这是你的搜索词
string search=“Dog”//或“鸟”,或“狮子”,或“老虎”,或“鹰”或任何出现在你面前的东西
bool可爱=(bool)jObject[“宠物”][搜索][“可爱”];
int feet=(int)jObject[“Pet”][搜索][“feet”];
字符串temp=$“我的{search}是可爱的={cute}和脚={feet}”;
//如果你想要它在你的强烈类型,那么
Dog Dog=jObject[“Pet”][search].ToObject();
Bird Bird=jObject[“Pet”][search].ToObject();
输出:

在上述代码中

[“宠物”]=>json的第0个位置级别节点

[搜索]=>json的第一个位置级别节点

[“可爱”]或[“脚”]=>json的第二个位置级别节点,以及更多json深度节点


您可以找到有关查询Json的更多信息。您可以尝试使用这些类,然后在宠物列表上循环

  public class JsonParsed
{
    public Dictionary<string, Attribute> Pet { get; set; } 
}

public class Attribute
{
    public bool cute { get; set; }
    public int feet { get; set; }
}
public类JsonParsed
{
公共字典Pet{get;set;}
}
公共类属性
{
公共布尔值{get;set;}
公共整数{get;set;}
}
密钥包含宠物的名称,属性将包含其他属性

  var json = @"{'Pet': {'Dog': {'cute': true,'feet': 4},'Bird': {'cute': 
  false,'feet': 2}}}";
  var obj = JsonConvert.DeserializeObject<JsonParsed>(json);
 foreach (var element in obj.Pet)
 {
    Console.WriteLine(element.Key  + " has " + element.Value.feet);
 }
var json=@“{'Pet':{'Dog':{'cute':true,'feet':4},'Bird':{'cute':
假,“脚”:2}};
var obj=JsonConvert.DeserializeObject(json);
foreach(对象Pet中的var元素)
{
Console.WriteLine(element.Key+“has”+element.Value.feet);
}

根据OOP和其他设计原则,这种具有相同属性的结构不容易维护。 如果您可以更改类和JSON结构,那么我建议您使用以下示例结构

[{
      cute : true, 
      feet : 4, 
      type : "dog"
      }, {
      cute : true, 
      feet : 2, 
      type : "bird"
 }]
我们可以有一个宠物类对象的列表,而不是一个包含Bird和Dog子类的类

class Pet
{
    int Feet {get; set; }
    string Type { get; set; }
    bool Cute { get; set; }
}
现在,在您希望读取它的方法中,您可以读取Json并返回要搜索的列表

List<Pet> pets = ReadPetJson();
string Pet_Name = DummyPetName(); // Returns string 'Bird' or 'Dog' etc.
var matchedPet = pets.FirstOrDefault(x => 
x.Type.ToLower() == Pet_Name);
if (matchedPet != null)
   return matchedPet.Cute;
List pets=ReadPetJson();
字符串Pet_Name=DummyPetName();//返回字符串'Bird'或'Dog'等。
var matchedPet=pets.FirstOrDefault(x=>
x、 Type.ToLower()==Pet_Name);
if(matchedPet!=null)
返回匹配的宠物。可爱;

@batuzai04123,查看答案可能对您有帮助:)非常感谢您的反馈,但是根据我上面所说的,NEWTONSOFT.JSON的实现和模型映射是我们需要使用的。你的解决方案对那些想尝试这种方法的人来说是非常好的,我很喜欢:)这对你有帮助吗查看上面我更新的线程。有了你的代码,我不知道我为什么要再次将其转换为Object?因为
jObject[“Pet”][Pet_Name]
已经返回字符串值本身。我现在通过再次使用type对象获得它,非常感谢。这是使用JObject的最简单的解决方案,我向大家推荐这个解决方案。感谢您的投入,如果您还记得这个线程的介绍,“当前”实现是由第三方设置的。JSON文件是由另一个团队提供的,从那时起,他们的格式就一直是这样。如果JSON不能修改,那么模型也不能修改。但再次感谢你。甚至模型本身也已经设置了其他属性,看起来它们也会这样设置。我找到了反射库,我可以试试。我发现了一种伟大的艺术
List<Pet> pets = ReadPetJson();
string Pet_Name = DummyPetName(); // Returns string 'Bird' or 'Dog' etc.
var matchedPet = pets.FirstOrDefault(x => 
x.Type.ToLower() == Pet_Name);
if (matchedPet != null)
   return matchedPet.Cute;