代码之家  ›  专栏  ›  技术社区  ›  ZZZSharePoint

在c中修改json值#

  •  0
  • ZZZSharePoint  · 技术社区  · 4 年前

    我已经编写了我的代码,在这里我阅读了一个api并获得了json输出,如下所示。

    {"BaseObject":"P|GL",
            "bbl:BL|12|11":"BL|GL|01",
            "kind": "Entity",    
            "BaseObjectDescription":"PlayerBatsman",
            "bbl:B827222":"downBatsman",
            "CreateDate":"06.01.2022",
            "Description":"PlayerBatsman",
     "errors": [
          
        {
                "ErrorMessage": "MissingUnit",
                "ObjType": "Property",
                "Object": "test:batsman",
                "RefObject": "bbl:BATS364"} ],   
            "bbl:NO87872":"GHG66762",    
            "bbl:PONI9912":"bbl:NOI65661",    
            "bbl:KOK1022":"KOK002",
            "bbl:997171SD":"bbl:YUT12232",    
            "bbl:89812":false,    
            "bbl:4894":"pd:96",    
            "bbl:KITE212":"pd:QUTEQ001",
            "ProjectCategory":"Feed",
            "bbf:type":["[\"bbl:P3924\",
            \"boss:Noball\"]"],
            "primarybbf:type":"[\"bbl:P101003924\",\"boss:Tag\"]"}
    

    但现在我需要修改我的输出,如下所示:

    {
    data": {
        "kind": "ENTITY",
        "payload": {
          "tag-batsman:attributes": {
            "bbl:B827222":"downBatsman",
            "bbl:BATS364": null,
            "bbl:NO87872":"GHG66762",
            "bbl:KOK1022":"KOK002",
            "bbl:89812":false       
          },      
          "relations": {
            "bbl:PONI9912":[
              "NOI65661"
            ],
            "bbl:997171SD": [
              "YUT12232"
            ],
            "bbl:4894": [
              "pd:96"
            ],
            "bbl:KITE212": [
              "pd:QUTEQ001"
            ],
            
            "tag-bbf-pubsub:type": [
              "P3924",
              "P101003823",
              "P101003856",
              "P101003858",
              "P101003932",
              "P101004021"
            ]
          },      
          },      
        },
        "type": "EQUIPMENT",
        "version": "data-4-build-606"
      }
    }
    

    基本上我需要的是创建这个json,如果 “bbl:xyz” 输入json包含的密钥 bbl: 或 pd: 在他们的价值观中,他们就失败了 “关系” 输出json的键,如上所示,其余全部 bbl:xyz 会破产的 “属性” 如上面的Json模型所示,rest键和值对是常量,可以管理。我怎么能用C#来做呢?

    首先,假设我的输入json在下面的响应消息中被记录为流。我该如何从这里开始?

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    var req1 = await ProxyRequest(req.Body);
    var responseMessage = await req1.Content.ReadAsStreamAsync();
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   msmolcic    4 年前

    我不确定我是否完全理解了所有的需求,并且映射对我来说也不完全清楚,但是您可以使用类似的库 Newtonsoft.Json 做这样的事。我想这个样本至少能让你走上正轨。

    internal class JsonTranslatorOptions
    {
        public JsonTranslatorOptions(
            string kind,
            string type,
            string version)
        {
            Kind = kind;
            Type = type;
            Version = version;
        }
    
        public string Kind { get; }
        public string Type { get; }
        public string Version { get; }
    }
    
    internal enum PropertySection
    {
        None,
        Attribute,
        Relation
    }
    
    internal class JsonTranslator
    {
        private const string KeyKeyword = "bbl:";
        private static readonly string[] ValueKeywords = { KeyKeyword, "pd:" };
    
        private readonly JObject _attributes = new();
        private readonly JObject _data = new();
        private readonly JObject _payload = new();
        private readonly JObject _relations = new();
        private readonly JObject _root = new();
    
        public JsonTranslator(JsonTranslatorOptions options)
        {
            Initialize(options);
        }
    
        public JObject Translate(JObject input)
        {
            TraverseObject(input);
    
            return _root;
        }
    
        private void TraverseObject(JObject input)
        {
            foreach (JProperty property in input.Properties())
            {
                TraverseProperty(property);
            }
        }
    
        private void TraverseArray(JArray array)
        {
            foreach (JToken element in array)
            {
                if (element is JValue)
                {
                    continue;
                }
    
                foreach (JProperty property in ((JObject)element).Properties())
                {
                    TraverseProperty(property);
                }
            }
        }
    
        private void TraverseProperty(JProperty property)
        {
            switch (property.Value.Type)
            {
                case JTokenType.Object:
                    TraverseObject((JObject)property.Value);
                    break;
                case JTokenType.Array:
                    TraverseArray((JArray)property.Value);
                    break;
                default:
                    MapPropertyValue(property);
                    break;
            }
        }
    
        private void MapPropertyValue(JProperty property)
        {
            switch (GetPropertySection(property))
            {
                case PropertySection.Attribute:
                    _attributes.Add(property);
                    break;
                case PropertySection.Relation:
                    _relations.Add(property);
                    break;
            }
        }
    
        private static PropertySection GetPropertySection(JProperty property)
        {
            var value = property.Value.Value<string?>();
    
            if (!property.Name.Contains(KeyKeyword))
            {
                return PropertySection.None;
            }
    
            if (value is null || !ValueKeywords.Any(keyword => value.Contains(keyword)))
            {
                return PropertySection.Attribute;
            }
    
            return PropertySection.Relation;
        }
    
        private void Initialize(JsonTranslatorOptions options)
        {
            _root.Add("data", _data);
    
            InitializeData(options);
        }
    
        private void InitializeData(JsonTranslatorOptions options)
        {
            _data.Add("kind", options.Kind);
            _data.Add("payload", _payload);
            _data.Add("type", options.Type);
            _data.Add("version", options.Version);
    
            InitializePayload();
        }
    
        private void InitializePayload()
        {
            _payload.Add("tag-batsman:attributes", _attributes);
            _payload.Add("relations", _relations);
        }
    }
    

    使用它应该是这样的:

    var json = JObject.Parse(@"{""BaseObject"":""P | GL"",""bbl: BL | 12 | 11"":""BL | GL | 01"",""BaseObjectDescription"":""PlayerBatsman"",""bbl: B827222"":""downBatsman"",""CreateDate"":""06.01.2022"",""Description"":""PlayerBatsman"",""errors"":[{""ErrorMessage"":""MissingUnit"",""ObjType"":""Property"",""Object"":""test: batsman"",""RefObject"":""bbl: BATS364""}],""bbl: NO87872"":""GHG66762"",""bbl: PONI9912"":""bbl: NOI65661"",""bbl: KOK1022"":""KOK002"",""bbl: 997171SD"":""bbl: YUT12232"",""bbl: 89812"":false,""bbl: 4894"":""pd: 96"",""bbl: KITE212"":""pd: QUTEQ001"",""ProjectCategory"":""Feed"",""bbf: type"":[""[\""bbl:P3924\"",\""boss:Noball\""]""], ""primarybbf:type"":""[\""bbl:P101003924\"",\""boss:Tag\""]""}");
    var options = new JsonTranslatorOptions(
        kind: "ENTITY",
        type: "EQUIPMENT",
        version: "data-4-build-606");
    var translator = new JsonTranslator(options);
    var output = translator.Translate(json);
    Console.WriteLine(output.ToString());
    

    它提供的电流输出:

    {
      "data": {
        "kind": "ENTITY",
        "payload": {
          "tag-batsman:attributes": {
            "bbl: 89812": false
          },
          "relations": {
            "bbl: PONI9912": "bbl: NOI65661",
            "bbl: 997171SD": "bbl: YUT12232",
            "bbl: 4894": "pd: 96",
            "bbl: KITE212": "pd: QUTEQ001"
          }
        },
        "type": "EQUIPMENT",
        "version": "data-4-build-606"
      }
    }