2017-02-10 14 views
1

Json.NET 및 System.Linq.Dynamic을 사용하여 복잡한 json 개체를 사용자 정의 필터/조건부와 일치 시키려고합니다. .System.Linq.Dynamic을 사용하여 JSON 개체가 조건부와 일치하는지 확인하는 방법

없음 속성 또는 필드 '이름'형태로 존재하지 않는다 '객체'

: 이것은 나에게 Where -statement있는 라인에 오류가 있습니다

var json = @"{""Name"":""Jane Doe"",""Occupation"":""FBI Consultant""}"; 
dynamic person = JObject.Parse(json); 
var people = new[] { person }; 
var isMatch = people.Where("[email protected]", "Jane Doe").Any(); 
Console.WriteLine(isMatch); 

: 여기 내 코드입니다

대신 익명 개체를 사용하면 두 번째 줄을 다음과 같이 바꿔야합니다.

json 개체가 일치하는지 확인하기 위해 문자열 조건자를 통해 쿼리 할 수있는 json 문자열을 deserialize 할 다른 방법이 있습니까?

EDIT : json-string 및 Where- 문은 동적이며 사용자가 제공합니다. 많은 속성이 있으며 코드를 실행하기 전에 이름을 알지 못합니다. 필드의 이름과 값은 모두 사용자가 제공합니다. 로 간단하게 할 수

var isMatch = people.Where(x => x.Name == "Jane Doe").Any(); 

:

var isMatch = people.Any(x => x.Name == "Jane Doe"); 

이 당신이 원하는되지 않을 수도 있습니다,하지만 간단한을 System.Linq은 쉽게 당신의 요구를 충족 할 수

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/18734996/how-to-use-linq-with-dynamic-collections –

+0

['SelectToken'] (http://www.newtonsoft.com/ json/help/html/QueryJsonSelectTokenJsonPath.htm) 와일드 카드'*'연산자를 사용하면 사용자의 요구를 충족시킬 수 있습니다. [JObject 계층에서 이름으로 특정 JToken 검색하기] (https://stackoverflow.com/a/29782523/3744182)를 참조하십시오. – dbc

답변

1

이 당신의 Where 문을 교체합니다. 동적으로이 작업을 수행 할 경우에 대한

:

var isMatch = people.Any(x => x.GetValue("Name") == "Jane Doe"); 
+0

내 요구는 문자열 술어로 json-string 내부의 객체를 쿼리하는 것이므로 맞습니다. 이것이 도움이되지 않습니다. – Espo

+0

@Espo 나는 당신을 진심으로 이해합니다.하지만 여전히 Json만을 사용하고 싶다면 내 대답을 다시 검토 할 수 있습니다. – meJustAndrew

0
var json = @"{""Name"":""Jane Doe"",""Occupation"":""FBI Consultant""}"; 
dynamic person = JObject.Parse(json); 
var people = new List<object>(){ person }; 
var filedName = "Name"; 
var searchValue = "Jane Doe";  

var any = people.Any(p => p.GetType().GetProperty(filedName).GetValue(p, null) as string == searchValue); 
+0

필드 이름과 값 모두 사용자가 제공하므로 나에게 도움이되지 않습니다. 죄송합니다. – Espo

+0

당신은 varibles ther을 사용할 수 있다는 것을 알고 있습니까? –

+0

지금 좋은가요? –

0

편집

이 실제로 차이를 만드는, 귀하의 의견 주셔서 감사합니다. 조금 늦게 답변을 드려 죄송합니다.하지만 여전히 도움이 될 수 있습니다. 동적 매개 변수 이름과 매개 변수 값으로 작동 완전한 테스트 아래

는 :

void Main() 
{ 
    var json = @"{""Name"":""Jane Doe"",""Occupation"":""FBI Consultant"", ""Info"": {""Age"":28, ""Gender"":""Female""}}"; 
    Console.WriteLine("Match Name: " + json.JsonMatch("Name", "Jane Doe")); 
    Console.WriteLine("Match Age: " + json.JsonMatch("Info.Age", "28")); 
} 

public static bool JsonMatch(this string json, string key, string value) 
{ 
    dynamic obj = JObject.Parse(json); 
    var values = obj.PropertyValues(); 
    foreach (var element in values) 
    { 
     if (element.Path == key) 
     { 
      return element.Value == value; 
     } 
     if (element.Path == null) 
     { 
      foreach (var subelement in element) 
      { 
       if (subelement.Path == key) 
       { 
        return subelement.Value == value; 
       } 
      } 
     } 
    } 
    return false; 
} 

가 누군가를 도움이되기를 바랍니다 :

 // Given 
     var json = @"{""Name"":""Jane Doe"",""Occupation"":""FBI Consultant""}"; 
     var person = JObject.Parse(json); 
     var people = new[] {person}; 

     // When 
     var isMatch = people.Any(p => p.GetValue("Name").Value<string>() == "Jane Doe"); 

     // Then 
     Assert.IsTrue(isMatch); 
+0

문자열 술어/필터를 사용해야합니다. 필드 이름과 값 모두 사용자가 제공하므로 나에게 도움이되지 않습니다. 죄송합니다. – Espo

0

또한 다른 사람의 게시물에 대한 답변을 읽고 난 후에 나는이 솔루션을 만들었습니다.