C# JSON 强制修补程序

本文关键字:修补 程序 JSON | 更新日期: 2023-09-27 18:35:46

假设有一个空的 is JSON 对象:

String obj1 = "{}";

有没有办法修补更新它并使用 C# 强制创建丢失的路径?所以在这样的补丁之后:

{ "op": "add", "path": "/a/b", "value": "foo" },

其结果将是:{ a: { b: "foo" } }

C# JSON 强制修补程序

不确定你的问题到底是什么,如果我错了,你可以使用 System.Dynamic.ExpandoObject 或使用 IDictionary 在 C# 中创建那些自定义 json 对象,或者两者兼而有之,就像我的例子一样(如果我懒惰),正如评论所说,这更像是一个解析,而不是一个转换:

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace ExpandoObject
{
    class Program
    {
        static void Main(string[] args)
        {
            string stringObj;
            stringObj = "{'"op'": '"add'", '"path'": '"/a/b'", '"value'": '"foo'"}";
            Console.WriteLine(JsonConvert.SerializeObject(GetObjectPatchResult(stringObj)));
            stringObj = "{'"op'": '"add'", '"path'": '"/a/b/c/d/e/f/g/h/i/j'", '"value'": '"foo'"}";
            Console.WriteLine(JsonConvert.SerializeObject(GetObjectPatchResult(stringObj)));
        }
        private static object GetObjectPatchResult(string param)
        {
            dynamic expando = new System.Dynamic.ExpandoObject();
            var result = (IDictionary<string, object>)expando;
            var parchObject = JsonConvert.DeserializeObject<PatchObject>(param);
            var level = result;
            int i = 0;
            foreach (var path in parchObject.Path.Split('/'))
            {
                i++;
                if (string.IsNullOrEmpty(path)) continue;
                dynamic pathExpando = new System.Dynamic.ExpandoObject();
                level[path] = (IDictionary<string, object>)pathExpando;
                if (i < parchObject.Path.Split('/').Count())
                {
                    level = (IDictionary<string, object>)level[path];
                }
                else
                {
                    level[path] = parchObject.Value;
                }
            }
            return result;
        }
    }
    public class PatchObject
    {
        public string Op { get; set; }
        public string Path { get; set; }
        public string Value { get; set; }
    }
}

结果:

{"

a":{"b":"foo"}}

{"a":{"b":{"c":{"d":{"e":{"f":{"g":{"h":{"

i":{"j":"foo"}}}

按任意键继续 . . .