JObject에 JToken을 어떻게 추가합니까?
JSON.Net을 사용하여 일부 텍스트의 JSON 개체를 기존 JSON 파일에 추가하려고합니다. 예를 들어 아래와 같은 JSON 데이터가있는 경우 :
{
"food": {
"fruit": {
"apple": {
"colour": "red",
"size": "small"
},
"orange": {
"colour": "orange",
"size": "large"
}
}
}
}
나는 이것을 이렇게하려고 노력 해왔다.
var foodJsonObj = JObject.Parse(jsonText);
var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}");
var bananaToken = bananaJson as JToken;
foodJsonObj["food"]["fruit"]["orange"].AddAfterSelf(bananaToken);
그러나 이것은 오류를 제공합니다. "Newtonsoft.Json.Linq.JProperty cannot have multiple values."
실제로 몇 가지 다른 방법을 시도했지만 아무데도 갈 수없는 것 같습니다. 제 예에서 제가 정말로하고 싶은 것은 "과일"에 새 항목을 추가하는 것입니다. 이 작업을 수행하는 더 좋은 방법이나 사용하기 더 간단한 라이브러리가 있는지 알려주십시오.
JSON.Net에서 무엇이 담을 수 있는지에 대해 혼란스러워하고 있다고 생각합니다.
- A
JToken
는 모든 종류의 JSON 값에 대한 일반적인 표현입니다. 문자열, 객체, 배열, 속성 등이 될 수 있습니다. - A
JProperty
는JToken
이름과 쌍을 이루는 단일 값입니다. 에만 추가 할JObject
수 있으며 다른 값이 될 수 없습니다JProperty
. - A
JObject
는JProperties
. 다른 종류의JToken
직접 담을 수 없습니다 .
코드에서 이미 값 (를 포함 ) 이있는 ( "orange")에 ( " JObject
banana"데이터를 포함하는 것) 을 추가하려고합니다 . 보시다시피 오류가 발생합니다.JProperty
JObject
{"colour":"orange","size":"large"}
정말로하고 싶은 것은 다른 과일을 포함하는 JProperty
"바나나"를 추가하는 것 입니다. 수정 된 코드는 다음과 같습니다.JObject
JProperties
JObject foodJsonObj = JObject.Parse(jsonText);
JObject fruits = foodJsonObj["food"]["fruit"] as JObject;
fruits.Add("banana", JObject.Parse(@"{""colour"":""yellow"",""size"":""medium""}"));
요약 : JObject에 JProperty를 추가해야합니다. 단순한. 인덱스 쿼리는 JValue를 반환하므로 대신 JProperty를 얻는 방법을 찾으십시오. :)
받아 들여지는 대답은 보이는 것처럼 질문에 대답하지 않습니다. 특정 속성 뒤에 JProperty를 구체적으로 추가하려면 어떻게해야합니까? 먼저, 내 머리가 제대로 작동하는 용어부터 시작하겠습니다.
- JToken = 다른 모든 유형의 어머니. A JValue, JProperty, JArray 또는 JObject 일 수 있습니다. 이는 구문 분석 메커니즘에 모듈 식 설계를 제공하기위한 것입니다.
- JValue = 모든 Json 값 유형 (문자열, 정수, 부울).
- JProperty = 이름 (식별자) 과 쌍을 이루는 JValue 또는 JContainer (아래 참조 ) . 예를 들면
"name":"value"
. - JContainer = 다른 유형 (JObject, JValue)을 포함하는 모든 유형의 어머니.
- JObject = JProperties 컬렉션을 보유하는 JContainer 유형
- JArray = 콜렉션 JValue 또는 JContainer를 보유하는 JContainer 유형.
이제 인덱스 []를 사용하여 Json 항목을 쿼리 할 때 식별자없이 JToken을 얻습니다. 이는 JContainer 또는 JValue (캐스트 필요) 일 수 있지만 값일 뿐이므로 그 뒤에는 아무것도 추가 할 수 없습니다. 자체적으로 변경하고 더 깊은 값을 쿼리 할 수 있지만 예를 들어 그 뒤에는 아무것도 추가 할 수 없습니다.
실제로 얻고 자하는 것은 전체 속성이고 원하는대로 그 뒤에 다른 속성을 추가합니다. 이를 위해를 사용 JOjbect.Property("name")
하고 원하는 다른 JProperty를 만든 다음이 using AddAfterSelf
메서드 뒤에 추가합니다 . 그러면 끝났습니다.
자세한 정보 : http://www.newtonsoft.com/json/help/html/ModifyJson.htm
이것은 내가 수정 한 코드입니다.
public class Program
{
public static void Main()
{
try
{
string jsonText = @"
{
""food"": {
""fruit"": {
""apple"": {
""colour"": ""red"",
""size"": ""small""
},
""orange"": {
""colour"": ""orange"",
""size"": ""large""
}
}
}
}";
var foodJsonObj = JObject.Parse(jsonText);
var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}");
var fruitJObject = foodJsonObj["food"]["fruit"] as JObject;
fruitJObject.Property("orange").AddAfterSelf(new JProperty("banana", fruitJObject));
Console.WriteLine(foodJsonObj.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.GetType().Name + ": " + ex.Message);
}
}
}
Just adding .First
to your bananaToken
should do it:
foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken
.First
);
.First
basically moves past the {
to make it a JProperty
instead of a JToken
.
@Brian Rogers, Thanks I forgot the .Parent
. Edited
참고URL : https://stackoverflow.com/questions/15413825/how-do-you-add-a-jtoken-to-an-jobject
'Development Tip' 카테고리의 다른 글
Java 객체 참조를 반환하는 것이 원시 반환보다 훨씬 느린 이유 (0) | 2020.10.23 |
---|---|
Java에서 두 문자를 추가 한 결과는 int 또는 char입니까? (0) | 2020.10.23 |
컴포넌트와 디렉티브의 차이점은 무엇입니까? (0) | 2020.10.23 |
Groovy에는 2 개의 맵을 병합하는 방법이 있습니까? (0) | 2020.10.23 |
matplotlib (동일한 단위 길이) : '동일한'종횡비 사용 z 축이 x 및 y-와 같지 않음 (0) | 2020.10.23 |