【问题标题】:How to override values in JObject如何覆盖 JObject 中的值
【发布时间】:2021-07-03 00:43:10
【问题描述】:

我一直在尝试覆盖我的 JObject 中的值(我从网络应用程序中接收它,所以它可能会有所不同)。我尝试使用 for 循环,但我不知道如何使用 JObject 进行迭代。 Foreach 没用,因为我无法编辑 JObject 中的值。

这是我的尝试:

public JObject TranslateJson(string jsonString, LanguageCharset languageCharset)
    {
      JObject json = JObject.Parse(jsonString);
      for ( int i = 0; i > json.Count; i++)
      {
        json[i].Value = "test"; //Compiler Error CS1656
      }
      return json;
    }

#Update1

public JObject TranslateJson(string jsonString, LanguageCharset languageCharset)
    {
      JObject json = JObject.Parse(jsonString);
      foreach (var x in json)
      {
        json[x.Key] = "test";
      }
      return json;
    }

#Update2

部分json:

{
  "common": {
    "appName": "[App name] Web",
    "other": "other",
    "others": "others",
    "dateRange": {
      "start": "Date from",
      "end": "Date to"
    },
    "sidebar": {
      "dashboard": "[App name] dashboard",
      "violations": {
        "list": "Infringement list",
        "timeline": "Activities and infringements"
      },
      "drivers": "Driver list",
      "profile": "Profile",
      "settings": "Settings",
      "logout": "Sign out"
    },
    "tariff": {
      "name": {
        "CZ": "Czech tariff",
        "RO": "Romanian tariff",
        "DE": "German tariff",
        "GB": "British tariff",
        "LT": "Lithuanian tariff",
        "DK": "Danish tariff",
        "PL": "Polish tariff",
        "BE": "Belgian tariff",
        "CH": "Swiss tariff",
        "FR": "French tariff",
        "LU": "Luxembourgish tariff",
        "SE": "Swedish tariff",
        "HU": "Magyar tariff"
           [..] (more nestings)

#更新 3

示例输入 json:

{
  "weapons": 
  {
    "axe": "axe",
    "sword": "sword" },
  "tools":
  {
    "saw": "saw"
  }
}

示例输出:

{
  "weapons": 
  {
    "axe": "translated",
    "sword": "translated" },
  "tools":
  {
    "saw": "translated"
  }
}

为什么只翻译?因为当我可以覆盖该 json 结构的任何嵌套中的值时,我就可以调用我的 transtalion 函数。

【问题讨论】:

标签: c# json .net loops asp.net-core


【解决方案1】:

下面是一个demo,你可以看看。

var jsonString = @"
                    { items: [
                    {
                      ""name"": ""1111"", 
                      ""name2"": ""value2"", 
                      ""type"":  ""2222""
                    },
                    {
                      ""name"": ""33333"",
                      ""name2"": ""value2"",
                      ""type"": ""444444""
                    }
                    ] }";
       
        JObject json = JObject.Parse(jsonString);
       
        foreach (JObject o in json["items"].AsEnumerable())
        {
           foreach (var x in o)
            {    
               o[x.Key] = "test";        
            } 
        }
       

测试结果:

【讨论】:

  • 很接近,但不是我想要的。因为第一个:我不知道如何调用第一个节点(它可以是项目、语言或其他东西)。第二,它可以有多个节点,测试文件有11个嵌套节点,所以我需要以不同的方式来做。我将发布json文件进行翻译
【解决方案2】:

我尝试过类似的方法:

public string TranslateJson(string jsonString, LanguageCharset languageCharset)
    {
      JToken json = JToken.Parse(jsonString);
      foreach (var element in json)
      {
        if (element is JObject)
        {
          return "object";
        } else if (element is JArray)
        {
          return "array";
        }
      }
      return "you fckd up";
    }

它总是返回“you fckd up”,但我想得到一些与它不同的东西,但不知道如何实现它

【讨论】:

  • 发生这种情况是因为元素始终是“属性”。
  • 是的,Token 的元素是属性。但 Property.Value 应该是 JToken。
  • @DragandDrop 然后当我尝试做 if (element.Value is JToken) 然后在这一行我得到错误:docs.microsoft.com/en-us/dotnet/csharp/misc/…
  • stackoverflow.com/questions/57322438/… 可能会有所帮助。要获取类型,您还可以使用 type 属性并与 jtoken 类型枚举进行比较。
猜你喜欢
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2014-02-15
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多