0

JOSN データを受け取るサードパーティ プログラムがあります。Json には 2 つの方法があります。http://json2csharp.com/ を使用して 2 つの JSON メッセージを表す 2 つのクラスを作成しました

public class Data1
{
    public Content1 content { get; set; }

    public string name { get; set; }

    public string address { get; set; }

    public string age { get; set; }
}


public class Data2
{
    public Content2 content { get; set; }

    public string name { get; set; }

    public string address { get; set; }

    public string age { get; set; }
}

それらは Content1 と Content2 を除いて同じです (私はそれらのクラスも持っています)。

次のようにデータをデシリアライズしたい:

var object1 = JsonConvert.DeserializeObject<Data1>(message1);
var object2 = JsonConvert.DeserializeObject<Data2>(message2);

しかし、どのようなメッセージを受け取るかはわかりません。逆シリアル化して使用できる 1 つのクラスを作成するにはどうすればよいでしょうか。

この例https://www.jerriepelser.com/blog/deserialize-different-json-object-same-class/を見て、次を持つスーパークラスを作成しようとしました:

[JsonConverter(typeof(SuperData))] 

しかし、 ReadJson関数を実装する方法がわかりません。

入ってくるデータをチェックして、コンテンツのタイプがContent1Content2かを検出しますか? もしそうなら、どうすればいいですか?

次に、どのクラスがデシリアライズされたかを知るにはどうすればよいのでしょうか?

jsonは次のとおりです。

{
    "content": {
    "person_id": "1234",
    "timestamp": "2018-10-30 13:09:04.382885",
    "features": "old, cranky"
  },

  "name": "JoeBloggs",
  "address": "address1",    
  "age": 31,    
}

データ2

{
  "content": 
  {
    "detections": 1,

    "detection_boxes": [
      {
        "name": "JoeBloggs",
        "bbox": [
          1988.162842886987,
          -20.466329557695307,
          2662.417876180017,
          846.0808020362452
        ],
        "id": 3610
      }
    ],

    "timestamp": "2018-10-30 13:09:07.171000",
    ]
  },

  "name": "JoeBloggs",
  "address": "address1",    
  "age": 31,    
}

私はこれを試しました:

[JsonConverter(typeof(MyDataConverter))]
public class MegaData
{
    public object content { get; set; }

    public string name { get; set; }

    public string address { get; set; }

    public string age { get; set; }
}

MyDataConverterには次のものがあります。

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);
        var content = jObject["message_content"];
        if (content["person_id"] != null)
        {
            return jObject.ToObject<Data1>();
        }
        else
        {
            return jObject.ToObject<Data2>();
        }
    }

次に、次のようにデシリアライズを試みます。

var alert = JsonConvert.DeserializeObject<MegaData>(message1); <-- EXCEPTION

**Unable to cast object of type 'Data1' to type 'MegaData'.**

これが機能するには、MegaData クラスはどのように見える必要がありますか??

4

2 に答える 2