# Mit JSON Java und C# verbinden



## Gachl (29. Jul 2010)

Hallo!

Ich versuche gerade ein C# und ein Javaprogramm mittels JSON über Sockets kommunizieren zu lassen. Dafür habe ich in C# und in Java zwei identische Klassen erstellt.

In C# verwende ich den System.Web.Script.Serialization.JavaScriptSerializer (aus der System.Web.Extensions lib) um die Klasse zu de-/serialisieren und in Java verwende ich com.thoughtworks.xstream.XStream und com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver für das Selbe.

Nun hab ich das Problem, dass mit der C# Serializer ein anderes Format ausspuckt als der XStream Parser lesen kann:
C# generiet:

```
{"Action":"Login","Parameters":{"Username":"asdf","Password":"wasd"}}
```
In Java die gleiche Klasse serialisiert sieht aber so aus:

```
{"command":{"Action":"Login","Parameters":{"entry":[{"string":["Password","wasd"]},{"string":["Username","asdf"]}]}}}
```

Die Klasse selbst ist nicht weiter als:
(pseudocode)

```
class Command
{
public string Action = "Login";
public KeyValue<String,Object> Parameters = { [ "Username", "asdf" ] , [ "Password", "wasd" ] };
}
```

In C# ist das KeyValue Object ein Dictionary<string, object> und in Java eine HashMap<String, Object>.

Wie man nun unschwer erkennen kann, kann man dem Java Deserializer die serialisierte C# Klasse nicht füttern, da dieser auf die Nase fällt. Das Problem mit dem {"command":-Teil hab ich gelöst, indem ich ihn einfach direkt als String anhänge, so kann der Java Deserializer wenigstens herausfinden um welche Klasse es sich handelt (ist zwar nicht schön, aber es hilft).

Meine Frage ist nun, wie kann ich die beiden JSON Serializer die gleiche Sprache sprechen lassen?


----------



## Geeeee (29. Jul 2010)

Von C# hab ich sehr wenig Ahnung und kann somit nur eine Idee für Java aussprechen:
Schau dir mal die json-lib an. Da kommst du dem C# Ergebnis schon etwas näher.


----------



## Tomate_Salat (29. Jul 2010)

Naja, ich habe mal gesucht aber nicht gefunden wonach ich suchte: eine lib für c# und java vom gleichen Entwickler(team). Insofern wirst du wahrscheinlich immer Differenzen haben, die früher oder später probleme machen werden. Also entweder: eigenen JSON-Parser schreiben, der sich verhält wie der von der anderen Sprache, was aber denke ich nicht einfach wird oder gleich 2 Parser schreiben..einen in C# einen in Java.
Oder du verzichtest auf JSON und schreibst dir ein anderes "Protokoll".

Naja, ansonsten. Viel Glück vllt findeste doch noch eine erfreulichere Lösung als die von mir Beschriebene...

MFG

Tomate_Salat


----------



## eRaaaa (29. Jul 2010)

Also ich würde dir gson empfehlen 
Damit solltest du auch direkt keine Probleme haben, der schluckt deinen C# String!

```
Gson gson = new Gson();
		String jsonString = "{\"Action\":\"Login\",\"Parameters\":{\"Username\":\"asdf\",\"Password\":\"wasd\"}}";
		Command command = gson.fromJson(jsonString, Command.class);
		System.out.println(command);
		// Command [action=Login, paramter={Username=asdf, Password=wasd}]
		System.out.println(gson.toJson(command));
		// {"Action":"Login","Parameters":{"Username":"asdf","Password":"wasd"}}

class Command {
	private String Action;
	private Map<String, String> Parameters;
	
	@Override
	public String toString() {
		return "Command [action=" + Action + ", paramter=" + Parameters + "]";
	}
}
```

Ansonsten bietet dir gson viel Spielraum, du kannst eigene InstanceCreator,Deserialisierer,TypeAdapter schreiben!


----------



## Gachl (29. Jul 2010)

Danke eRaaaa, das funktioniert super


----------

