【问题标题】:Json.net configure a node to be implicitJson.net 将节点配置为隐式
【发布时间】:2012-01-29 01:58:30
【问题描述】:

我不确定这是否可以做到,基本上我正在努力将 c# 对象映射到 json 提要。

问题是 json 文本包含一个对象名称,它实际上是一个唯一的 id,这意味着我不能简单地使用单个对象进行映射。

{
    "Persons": {
        "12345": {
            "surname": "smith", 
            "firstname":  "jim"
            "language": "en"
        },
       "99999": {
            "surname": "blog", 
            "firstname":  "joe"
            "language": "en"
        },
        "87534": {
            "surname": "bond", 
            "firstname":  "james"
            "language": "en"
        }
    }
}

我拥有的对象结构是一个名为 Persons 的类,其中包含一个 IList 属性。

如您所见,对象名称实际上是唯一的 id,但可能是相同的类型。 我无法控制 json 提要,所以我不能简单地编辑该端。

在 json.net 中我能做些什么来解决这个问题吗?也许是一个属性???

【问题讨论】:

  • 我是否正确理解您使用的是JsonConvert.SerializeObject()?您可以手动创建 JSON 吗?
  • 这看起来更像Dictionary,而不是List

标签: c# visual-studio json json.net


【解决方案1】:

我不是 JSON.NET 用户,所以如果这不适用,我深表歉意。您的 JSON 结构似乎更好地匹配定义了 PersonDictionary<int, Person> 集合:

public class Person
{
    public string surname { get; set; }
    public string firstname { get; set; }
    public string language { get; set; }
}

分层数据结构通常不能很好地与 List<T> 集合融合。

【讨论】:

    【解决方案2】:

    我自己刚刚发现了 JSON.NET,所以不确定我所说的是否 100% 准确。我认为您不能使用序列化,因为正如您所指出的,输入字符串不是正确的 JSON,因此序列化代码很可能会阻塞。

    因此,您要做的是进行一些预处理并将该列表转换为适当的形式,然后再进行进一步的工作。似乎 LINQ to JSON 是一个完美的解决方案,因为 LINQ 允许您根据需要操作单个元素。因此,您可以取一个属性名称,并重新创建包含“id”的新对象类型,其值恰好与以前的外部属性名称匹配。

    我想这就是你想要的:

        private void Test1()
        {
            string testInput = @"{
                                    ""Persons"": {
                                        ""12345"": {
                                            ""surname"": ""smith"", 
                                            ""firstname"":  ""jim"",
                                            ""language"": ""en""
                                        },
                                        ""99999"": {
                                            ""surname"": ""blog"", 
                                            ""firstname"":  ""joe"",
                                            ""language"": ""en""
                                        },
                                        ""87534"": {
                                            ""surname"": ""bond"", 
                                            ""firstname"":  ""james"",
                                            ""language"": ""en""
                                        }
                                    }
                                }";
    
            JObject jsonPeople = JObject.Parse( testInput );
    
            var query = from p in jsonPeople[ "Persons" ].Children().Cast< JProperty >()
                        select new JObject( 
                            new object[] { new JProperty( "id", p.Name ) }
                            .Concat( p.Value.Children() ) );
    
            JObject outJson = new JObject( new JProperty( "Persons", query ) );
    
            System.Diagnostics.Debug.Print( outJson.ToString() );
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多