当前位置: 首页 > 面试题库 >

C#是否具有用于解析多级级联JSON的库?

戚俊健
2023-03-14
问题内容

是否有一个库(首选C#)来解决我称为多级层叠JSON的问题?

这是我的意思的示例: (Pseudocode / C#)

var json1 = @"{
    ""firstName"": ""John"",
    ""lastName"": ""Smith""
    }";

var json2 = @"{
    ""firstName"": ""Albert""
    }";

var json3 = @"{
    ""phone"": ""12345""
    }";

var cascadingJSON = JSON.Cascade(json1, json2, json3);

结果 (行为与CSS相同)

{
    "firstName"": "Albert", /*Overridden*/
    "lastName"": "Smith", /*Inherited*/
    "phone"": "12345"   }"; /*Added*/
}

编辑1-更复杂的示例

const string json1 =
                @"{
                     ""firstName"": ""John"",
                     ""lastName"": ""Smith"",
                     ""age"": 25,
                     ""address"": 
                     {
                         ""streetAddress"": ""21 2nd Street"",
                         ""city"": ""New York"",
                         ""state"": ""NY"",
                         ""postalCode"": ""10021""
                     },
                     ""phoneNumber"": 
                     [
                         {
                           ""type"": ""home"",
                           ""number"": ""212 555-1234""
                         },
                         {
                           ""type"": ""fax"",
                           ""number"": ""646 555-4567""
                         }
                     ]
                 }";

            const string json2 =
                @"{
                     ""firstName"": ""John2"",
                     ""lastName"": ""robert"",
                     ""age"": 25,
                     ""address"": 
                     {
                         ""state"": ""FL"",
                     },
                     ""phoneNumber"": 
                     [
                         {
                           ""type"": ""fax"",
                           ""number"": ""222 222-2222""
                         },
                         {
                           ""type"": ""iphone"",
                           ""number"": ""111 111-1111""
                         }
                     ]
                 }";

            const string json3 =
                @"{
                     ""firstName"": ""John3"",
                     ""father"": ""guy""
                 }";

            const string expectedResult =
                @"{
                     ""firstName"": ""John3"",
                     ""lastName"": ""robert"",
                     ""age"": 25,
                     ""father"": ""guy"",
                     ""address"": 
                     {
                         ""streetAddress"": ""21 2nd Street"",
                         ""city"": ""New York"",
                         ""state"": ""FL"",
                         ""postalCode"": ""10021""
                     },
                     ""phoneNumber"": 
                     [
                         {
                           ""type"": ""home"",
                           ""number"": ""212 555-1234""
                         },
                         {
                           ""type"": ""fax"",
                           ""number"": ""222 222-2222""
                         },
                         {
                           ""type"": ""iphone"",
                           ""number"": ""111 111-1111""
                         }
                     ]
                 }";

编辑2

在对需求进行了更多思考之后,我看到了更复杂的示例永远无法按原样工作。例如,级联功能将无法知道某个电话号码是否已被修改,或者它是否是新的。为了使其工作,每个子实体都应具有唯一的标识符。


问题答案:

使用出色的JSON.NET库,这非常容易。此方法将对象与具有字符串,数字或对象的属性组合在一起。

public static string Cascade(params string[] jsonArray)
{
    JObject result = new JObject();
    foreach (string json in jsonArray)
    {
        JObject parsed = JObject.Parse(json);
        foreach (var property in parsed)
            result[property.Key] = property.Value;
    }
    return result.ToString();
}

结果,给出您的示例:

{
  "firstName": "Albert",
  "lastName": "Smith",
  "phone": "12345"
}

根据您更新的问题进行编辑:

通过将该解决方案调整为递归工作,可以合并子对象。下面的示例将符合您的预期结果(数组除外)。您将能够JArray以类似于合并对象(JObject)的方式轻松扩展此解决方案以合并数组()。

public static string Cascade(params string[] jsonArray)
{
    JObject result = new JObject();
    foreach (string json in jsonArray)
    {
        JObject parsed = JObject.Parse(json);
        Merge(result, parsed);
    }
    return result.ToString();
}

private static void Merge(JObject receiver, JObject donor)
{
    foreach (var property in donor)
    {
        JObject receiverValue = receiver[property.Key] as JObject;
        JObject donorValue = property.Value as JObject;
        if (receiverValue != null && donorValue != null)
            Merge(receiverValue, donorValue);
        else
            receiver[property.Key] = property.Value;
    }
}


 类似资料:
  • 我在航班(父)和航空公司(子)之间有一个单向的一对一映射,下面是我的代码- 航班没有任何的引用,这有id,命名他们的getter和setter。 在db是null。为什么?

  • 我有一个有两个阶段的Dockerfile;第一阶段从源代码构建一个react应用程序,第二阶段复制构建并添加一个NGINX服务器: 我也在使用gitlab-ci,我希望有多个阶段:构建、测试和部署。但是我不知道如何将构建和测试阶段分开,因为我使用的是多阶段的DockerFile。问题是所有的JS测试(对于React)都需要在“Yarn build”执行之前运行,并且build被复制到seconds

  • 我可以在中解析多级嵌套结构吗,就像我们在Java和库中所做的那样? 我已经对此进行了探索。 在Apex Salesforce中解析JSON 但是我想要一个通用的解决方案,它可以将任何JSON解析为所需的Apex对象。

  • 问题内容: 我正在尝试在VB6中使用Web服务。该服务-由我控制-当前可以返回SOAP / XML消息或JSON。我有一个非常困难的时候搞清楚,如果VB6的SOAP类型(第1版)可以处理返回-而不是简单的类型,如,等。到目前为止,我想不出什么,我需要做的就是VB6与返回玩对象。 所以我想我可以将Web服务中的响应序列化为JSON字符串。VB6是否存在JSON解析器? 问题答案: 请访问JSON.o

  • 我有一个网页与两个使用级联。第一个是州,第二个是城市。当您选择一个州时,您可以从第二个中选择城市。如果我用鼠标挑选它们,这工作得非常好。 问题是,当我试图将一些数据绑定到这些DropDownList时,状态更新了,但城市没有更新。 这是我的页面的HTML: 这就是JavaScript: 如果我使用以下代码绑定数据: 除非州已经包含值,否则它不会将设置为。 似乎使用不会在State中触发事件,然后C

  • 我想从short_name(国家名称)、name(州表)或region_name的任何可用数据中选择post_id。对region_name而不是short_name(国家名称),name(州表)执行以下查询,结果为真。 请告诉我,我哪里弄错了!