【问题标题】:Replace part of a JSON with other (using a string token)将部分 JSON 替换为其他部分(使用字符串标记)
【发布时间】:2015-10-09 18:49:07
【问题描述】:

我有一个无法解决的问题,我在不同的地方寻找和寻找,但我仍然没有找到它。

查看此代码:

//I have 2 json to merge  

var json = @"{'client': {'name': 'Should NO CHANGE', 'lastname': '', 'email': 'asd@asd.com', 'phone': '',  'birthday': '', 'married': false, 'spouse': {'name': '', 'lastname': ''} } }";

var json2 = @" {'client': {'name': 'aaaa', 'lastname': 'bbbb', 'email': 'cccccc@ccccc.com',  'phone': '', 'birthday': '', 'married': false,  'spouse': {'name': 'dddddd', 'lastname': 'eeeee'} } } ";

//for example to properties to replace
var path = "client.spouse";
var path2 = "client.email";

dynamic o1 = JObject.Parse(json);
dynamic o2 = JObject.Parse(json2);



//I want this, but using the string (LIKE REFLECTION) 
// NOT THE DYNAMIC object 
// Can be a simple property or a complex object
o1.client.spouse = o2.client.spouse;
o1.client.email = o2.client.email; 

我需要使用字符串而不是“o1.client.email”来替换内容。因为可以是任何东西。 (json也可以是任何东西)

我可以用字符串、动态或任何可行的方式替换。

(XML 有效,但我丢失了日期、布尔值或数字时的数据类型)

NetFiddle 中的示例。

【问题讨论】:

  • String.Replace 工作吗?
  • @EmpereurAiman 众所周知String replace does not work :)
  • 我不太理解这个问题,但是如果你想用字符串替换client.emailo1.client.email = "yourString"; 可以。
  • o1["client"]["email"]? JObjectJToken.
  • 您在寻找o1.client.email = o2.SelectToken("client.email"); 吗?

标签: c# json json.net


【解决方案1】:

您可以使用SelectToken 选择 JSON 对象层次结构中的任何项目。它支持JSONPath query syntax。它返回与所选项目的相对应的JToken,如果未找到则返回nullJToken 又具有 Replace(JToken replacement) 方法。因此你可以这样做:

var o1 = JObject.Parse(json);
var o2 = JObject.Parse(json2);

var path = "client.spouse";
o1.SelectToken(path).Replace(o2.SelectToken(path));

var path2 = "client.email";
o1.SelectToken(path2).Replace(o2.SelectToken(path2));

【讨论】:

  • 这正是我所需要的!非常非常感谢!
  • 注意,请小心,因为这仅在项目存在时才有效。如果该项目不存在,SelectToken 返回 null,您需要更改策略。
猜你喜欢
  • 2020-12-04
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2021-03-25
  • 1970-01-01
相关资源
最近更新 更多