programing

json.net을 사용하여 시리얼화된 JSON 문자열에 추가 속성을 추가하려면 어떻게 해야 합니까?

closeapi 2023. 4. 1. 09:19
반응형

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"
}

또 다른 방법으로는 사용자 정의 작성입니다.Itemserialization 중에 사용합니다.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

반응형