4

私が制御していないサービスから同様のJsonを取得しています:

"SomeKey": 
{
    "Name": "Some name",
    "Type": "Some type"
},
"SomeOtherKey": 
{
    "Name": "Some other name",
    "Type": "Some type"
}

NewtonSoft Json.Net を使用して、その文字列を .Net クラスに逆シリアル化しようとしています。これは、クラスが現在次のようになっているため、非常にうまく機能します。

public class MyRootClass
{
  public Dictionary<String, MyChildClass> Devices { get; set; }
}

public class MyChildClass
{
  [JsonProperty("Name")]
  public String Name { get; set; }
  [JsonProperty("Type")]
  public String Type { get; set; }
}

ただし、次のような辞書を使用せずに、クラスのフラット化されたバージョンをはるかに好みます。

public class MyRootClass
{
  [JsonProperty("InsertMiracleCodeHere")]
  public String Key { get; set; }
  [JsonProperty("Name")]
  public String Name { get; set; }
  [JsonProperty("Type")]
  public String Type { get; set; }
}

ただし、次のような customconverter のキーにアクセスする方法がわからないため、これを達成する方法の手がかりがありません。

http://blog.maskalik.com/asp-net/json-net-implement-custom-serialization

念のために、私が取得した Json 文字列の実際のサンプルを見つけることができるページへのリンク: Ninjablocks Rest API documentation with json samples

4

1 に答える 1

3

JSON.NET でそれを行う方法があるかどうかはわかりません。たぶん、あなたはそれを考えすぎています。JSON を逆シリアル化するための別の DTO 型を作成し、その結果をドメインにより適した別の型に射影するのはどうでしょうか。例えば:

public class MyRootDTO
{
  public Dictionary<String, MyChildDTO> Devices { get; set; }
}

public class MyChildDTO
{
  [JsonProperty("Name")]
  public String Name { get; set; }
  [JsonProperty("Type")]
  public String Type { get; set; }
}

public class MyRoot
{
  public String Key { get; set; }
  public String Name { get; set; }
  public String Type { get; set; }
}

次に、次のようにマッピングできます。

public IEnumerable<MyRoot> MapMyRootDTO(MyRootDTO root)
{
    return root.Devices.Select(r => new MyRoot
    {
        Key = r.Key,
        Name = r.Value.Name
        Type = r.Value.Type
    });
}
于 2013-04-01T23:28:10.923 に答える