【问题标题】:Create json Object in json Object and return it to Ajax在 json Object 中创建 json Object 并返回给 Ajax
【发布时间】:2019-09-18 14:26:36
【问题描述】:

我目前在 c# 中有一个List<Translations>,具有这种结构:

public class Translations
{
    public string en { get; set; }
    public string de { get; set; }
}

但我现在想将其转换为 Json Object ,因为我的函数通过 Ajax 调用此 Web 服务,需要完全具有以下结构的数据:

{
    de: { //-> de stands for the stored value in translations class
        'en_GB': en, //-> en stand for stored  value in translations class
        'de_DE': de // -> de same value as the key de
    }, 
    de: {
        'en_GB': en,
        'de_DE': de
    },
        de: {
        'en_GB': en,
        'de_DE': de
    }, 
    ...
}

我该怎么做? 我已经尝试使用这个工具创建我需要的类:Json2CSharp,但这里的问题是我需要在我的对象中拥有每个对象的动态键名。使用这个工具,它会为每个对象创建一个静态对象。

解决方案 感谢 Riaz Raza 的帮助

public static string getTranslations()
{
    List<Translations> translations = Connector.TranslationList();
    int count = translations.Count - 1;
    var translationsObject = new Dictionary<string, object>();

    for (int i = 0; i <= count; i++)
    {
        translationsObject.Add(
           translations[i].de,
           new Dictionary<string, object>() {
                 { "en_GB", translations[i].en },
                 { "de_DE", translations[i].de } }
             );

    }

    return JsonConvert.SerializeObject(translationsObject);
}

【问题讨论】:

  • “完全符合以下结构” 你不能。这是无效的 JSON(重复键)
  • 实际上de: 是动态的。每个de 都有不同的值。所以没有重复的密钥。对不起,如果我没有解释清楚
  • 你的问题很难理解。许多 JSON 序列化程序会将 IDictionary&lt;TKey, TValue&gt; 转换为 JSON 中的动态命名值,但我不明白您想要的 JSON 如何映射到您的 Translations 类型定义。

标签: c# json


【解决方案1】:

您可以使用Dict&lt;string, object&gt; 类型的字典代替类并动态填充它以匹配您所需的 JSON 对象。

更新:

示例代码:

var dic = new Dictionary<string, object>();

dic.Add("de", new Dictionary<string, object>() { { "en_GB", "en" }, { "de_DE", "de" } });

【讨论】:

  • 谢谢你,至少我现在在 C# 中具有与我的 Json 对象相同的结构,但不知何故,JsonConvert.SerializeObject(dic) 仅适用于 &lt;string, string&gt;,不适用于 &lt;string, object&gt;
  • 现在可以使用了。用我的最终解决方案更新了我的问题。感谢您的帮助!非常简单的解决方案
【解决方案2】:

我的建议是,如果您想在 JSON 中使用 C# 数据模型,您必须修改接收数据的 JS 函数,以便它接受来自 C# 模型的数据。这将是更准确的方法。

但是如果您无法访问 JS 代码或者它被限制修改,您可以使用 Newtonsoft Json.NET 属性,这将允许您在构建 JSON 文档时对其进行修改来自数据模型。

以下是 Newtonsoft 的一些示例:

public class User
{
    // always require a string value
    [JsonProperty("name", Required = Required.Always)]
    public string Name { get; set; }

    // don't require any value
    [JsonProperty("role", NullValueHandling = NullValueHandling.Ignore)]
    public string Role { get; set; }

    // property is ignored
    [JsonIgnore]
    public string Password { get; set; }
}

如果这不能解决您的问题,它始终是硬编码的方式,通过使用 Regex 等手动构建 JSON 字符串。但我建议将此作为最后一个选项,在大多数情况下,无需处理 JSON 即可硬编码。

参考您的评论,即每个 de: 都是唯一的,最好将您的 JSON 文档形成为数组。

这将允许您将其反序列化为数组并遍历它。

【讨论】:

  • @LukasR。在客户端上形成数据实际上不是一个好策略,如果您要在客户端上进行解析和其他操作,它会使您的网页变慢。所以我的建议是你应该在服务器端以适当的格式形成你的数据。
【解决方案3】:

如果您不想修改现有数据模型,我相信您可以使用custom JsonConverter(使用 Newtonsoft Json)实现您想要的。稍后我会尝试整理一个代码示例。

也就是说,从您提供的示例来看,您似乎在不必要地复制数据,这几乎不是最佳选择。

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多