【问题标题】:Manipulating JSON String in C# without Object在没有对象的 C# 中操作 JSON 字符串
【发布时间】:2015-10-19 06:46:41
【问题描述】:

我有从文件中读取的 JSON 字符串。 我没有 JSON 对象的来源。 所以我不能打电话给JsonConvert.DeserializeObject

但是我想检查 JSON 字符串是否具有特定结构,如果是,则附加一些字符串,或者如果不附加结构。

allmodules {
    feature: 'test-a'
}

submodules {
    //some data
}

假设没有allmodules,我想追加我的结构

allmodules {
    feature: 'debug-a'
}

如果它已经可用,只需附加feature: 'debug-a'

等等,我还有一些自定义工作要做。有没有任何有效的方法可以在不破坏 JSON 格式的情况下做到这一点。大多数关于字符串到对象反序列化的问题,但是正如我提到的,我没有原始对象,并且不能这样做。

【问题讨论】:

  • 我没有 JSON 对象的来源。 那么 JSON 在哪里呢?
  • @YuvalItzchakov JSON 来自文件。想像一个在运行时调整/附加一些数据到 JSON 文件的工具
  • 所以输入是任何 json,输出是一个与您的 json 模式相符的 json。
  • @singsuyash,输出符合源json结构的json。但是我附加了一些不会破坏结构的文本
  • JSON 是否具有已知结构?还是它们会完全动态?

标签: c# json appendchild


【解决方案1】:

您可以使用JObject 执行此操作并进行一些手动解析。它可能看起来像这样:

public string AppendAllModules(string json)
{
    var obj = JObject.Parse(json);
    JToken token;
    if (obj.TryGetValue("allmodules", out token))
        return json;

    obj.Add(new JProperty("allmodules", new JObject(new JProperty("feature", "test-a"))));
    return obj.ToString();
}

给定:

{
    "submodules": {
        "name": "yuval"
    }
}

会产生:

{
  "submodules": {
    "name": "yuval"
  },
  "allmodules": {
    "feature": "test-a"
  }
}

【讨论】:

  • @singsuyash 您的代码不符合 OP 的要求。您只需附加一个新的键值对。在你发布你的答案之前我就开始写这个答案了:)
【解决方案2】:

我没有 JSON 对象的来源。

不用担心,您可以简单地构造一个与 JSON 定义兼容的新 C# 对象。列出了许多选项

How to auto-generate a C# class file from a JSON object string

在您的项目中拥有兼容的 C# 类后,您可以反序列化 JSON 并将其作为对象进行操作,就像您拥有原始对象一样。

【讨论】:

  • J,如果源 JSON 字符串发生变化怎么办。我没有 JSON 会是这样的特定模型。它可能有一些子属性,也可能没有。关键是我不必了解相同的整个 JSON,只需附加我的自定义并继续前进
  • @Reddy:如果您反序列化为一个类型,类型安全将保护您免受不兼容的更改的影响,如果您只是将 JSON 作为字符串操作,您可能会不知道这些更改。如果第三方依赖项意外更改,我的偏好是让我的代码中断,而不是盲目地处理该依赖项。
  • 我同意你的观点,但是我没有进口权(称之为限制)
【解决方案3】:

使用JObject.FromObjectJObject.Parse 将您的文件json 字符串转换为JObject。 那么下面的示例代码可能会有所帮助。我将通过If/else 方式进行,因为您提到您无法获得确切的结构。

JObject obj = JObject.FromObject(
        new {Id = 5, Name = "Foo"}
    );
    JToken jtok = null;
    bool found = obj.TryGetValue("Bar",StringComparison.CurrentCultureIgnoreCase, out jtok);
    if (!found)
    {
        obj.Add("Bar","this is added");
    }
    else
    {
        Console.WriteLine(jtok);
    }

    Console.WriteLine(obj["Bar"]);

当然,在您编辑完JObject 之后,您可以使用JObject.ToString() 方法获取字符串表示形式并将其发送到文件中。

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 2017-02-23
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多