json.net을 사용하여 시리얼화된 JSON 문자열에 추가 속성을 추가하려면 어떻게 해야 합니까?
저는 MVC 4 프로그램에서 Json.net을 사용하고 있습니다.
나는 목적이 있다.item
계급의Item
.
나는 했다:string j = JsonConvert.SerializeObject(item);
이제 추가 속성을 추가합니다."feeClass" : "A"
안으로j
.
Json.net을 사용하여 이를 실현하려면 어떻게 해야 합니까?
몇 가지 옵션이 있습니다.
가장 쉬운 방법은 @Manvik의 제안대로 클래스에 다른 속성을 추가하여 시리얼화하기 전에 해당 값을 설정하는 것입니다.
그렇게 하고 싶지 않은 경우 다음 가장 쉬운 방법은 오브젝트를 로딩하는 것입니다.JObject
새 속성 값을 추가한 후 거기에서 JSON을 작성합니다.다음으로 간단한 예를 제시하겠습니다.
class Item
{
public int ID { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Item item = new Item { ID = 1234, Name = "FooBar" };
JObject jo = JObject.FromObject(item);
jo.Add("feeClass", "A");
string json = jo.ToString();
Console.WriteLine(json);
}
}
위의 출력은 다음과 같습니다.
{
"ID": 1234,
"Name": "FooBar",
"feeClass": "A"
}
또 다른 방법으로는 사용자 정의 작성입니다.Item
serialization 중에 사용합니다.aJsonConverter
그럼, 특정 클래스의 시리얼화 프로세스중에 기입되는 내용을 완전하게 제어할 수 있습니다.원하는 경우 속성을 추가하거나 속성을 표시하지 않거나 다른 구조물을 쓸 수도 있습니다.이 특수한 상황에서는 과잉 살상이라고 생각합니다만, 또 하나의 선택사항입니다.
이 기능을 구현할 수 있는 가장 깨끗한 방법은 다음과 같습니다.
dynamic obj = JsonConvert.DeserializeObject(jsonstring);
obj.NewProperty = "value";
var payload = JsonConvert.SerializeObject(obj);
Expando Object를 사용할 수 있습니다.여기에 역직렬화하고 속성을 추가한 후 다시 직렬화하십시오.
유사 코드:
Expando obj = JsonConvert.Deserializeobject<Expando>(jsonstring);
obj.AddeProp = "somevalue";
string addedPropString = JsonConvert.Serializeobject(obj);
유형에는 존재하지 않는 자산을 직렬화하는 가장 효율적인 방법은 맞춤형 계약 해결 프로그램을 사용하는 것이라고 생각합니다.이렇게 하면 클래스에 불필요한 속성이 낭비되는 것을 방지할 수 있을 뿐만 아니라 이 페이지에 있는 다른 대부분의 옵션에서 발생하는 추가 일련화 라운드 트립의 성능 저하도 방지할 수 있습니다.
public class SpecialItemContractResolver : DefaultContractResolver {
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) {
var list = base.CreateProperties(type, memberSerialization);
if (type.Equals(typeof(Item))) {
var feeClassProperty = CreateFeeClassProperty();
list.Add(feeClassProperty);
}
return list;
}
private JsonProperty CreateFeeClassProperty() {
return new JsonProperty {
PropertyName = "feeClass",
PropertyType = typeof(string),
DeclaringType = typeof(Item),
ValueProvider = new FeeClassValueProvider(),
AttributeProvider = null,
Readable = true,
Writable = false,
ShouldSerialize = _ => true
};
}
private class FeeClassValueProvider : IValueProvider {
public object GetValue(object target) => "A";
public void SetValue(object target, object value) { }
}
}
이 기능을 사용하려면:
// This could be put in a static readonly place so it's reused
var serializerSettings = new JsonSerializerSettings {
ContractResolver = new SpecialItemContractResolver()
};
// And then to serialize:
var item = new Item();
var json = JsonConvert.Serialize(item, serializerSettings);
언급URL : https://stackoverflow.com/questions/18692523/how-to-add-an-extra-property-into-a-serialized-json-string-using-json-net
'programing' 카테고리의 다른 글
WooCommerce Webhook: 잘못된 URL (0) | 2023.04.01 |
---|---|
JSON 키는 고유해야 합니까? (0) | 2023.04.01 |
투고 제목별로 WordPress 투고 가져오기 (0) | 2023.04.01 |
JavaScript 개체의 속성 값을 배열로 추출하려면 어떻게 해야 합니까? (0) | 2023.04.01 |
Woocommerce 제품 가격 표시(세금 포함 및 제외) (0) | 2023.03.27 |